Несмотря на ковариантность, вы не можете изменить тип возвращаемого значения интерфейса .Это ничем не отличается от ковариации в неуниверсальных классах.
interface Animal
{
Animal GetAnimal();
}
class Cat : Animal
{
//Not ALlowed
Cat GetAnimal()
{
return this;
}
//Allowed
Animal GetAnimal()
{
return this;
}
}
Проблема в том, что C в качестве специализации B<C>
возвращает C I<C>.GetT()
, однако для спецификации J требуется J GetT()
.
Попробуйте следующее:
interface I<out T>
where T : class, I<T>
{
T GetT();
}
interface J : I<J>
{
}
abstract class B<T,U> : I<U>
where T : B<T,U>, U
where U : class, I<U>
{
U I<U>.GetT()
{
return null;
}
}
class C : B<C,J>, J
{
}