以下代码示例:
interface I<out T>
where T : class, I<T>
{
T GetT();
}
interface J : I<J>
{
}
abstract class B<T> : I<T>
where T : B<T>
{
T I<T>.GetT()
{
return null;
}
}
class C : B<C>, J
{
}
无法编译(在带有 SP1 的 VS2010 下)并出现以下错误:
Error 4 'C' does not implement interface member 'I<J>.GetT()'
然而,C 确实实现了(通过其基 B)I,由于 I 被声明为协变,因此它也应该捕获 I (如 C : J)。
这是编译器错误吗?如果不是,为什么我不被允许这样做?
即使它是协变的,你无法更改接口的返回类型。这与非泛型类中的协方差没有什么不同。
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
{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)