Система типов C # не достаточно сложна, чтобы хорошо представлять понятие «я».ИМО, идеальное решение состоит в том, чтобы отказаться от этой цели и зависеть только от типа интерфейса:
interface IMyInterface
{
void MyMethod(IMyInterface a);
}
Если этого недостаточно, это часто говорит о том, что интерфейс плохо указан;Вы должны вернуться к чертежной доске и по возможности найти альтернативный дизайн.
Но если вам все еще действительно нужно, вы можете использовать (своего рода) версию C # CRTP :
interface IMyInterface<TSelf> where TSelf : IMyInterface<TSelf>
{
void MyMethod(TSelf a);
}
, а затем:
class MyClass : IMyInterface<MyClass>
{
public void MyMethod(MyClass a) {...} //implemented from the interface.
}
Обратите внимание, что это не совсем «безопасное» решение;ничто не мешает злой реализации использовать другой аргумент типа:
class EvilClass : IMyInterface<MyClass> // TSelf isn't the implementing type anymore...
{
public void MyMethod(MyClass a) {...} // Evil...
}
, который работает против вашей цели.