0
我有以下的复杂的继承层次:为什么这个继承层次不允许这个赋值?
I1<I3>
A1 : C1, I2
C2 : A1, I3
C3 : A2<C2>, I4
A2<C2> : I5, I1<C2>
以图片形式:
写作:
I1<I3> i = new C3();
...导致编译错误“无法转换源类型...到目标类型...“。
为什么?
我有以下的复杂的继承层次:为什么这个继承层次不允许这个赋值?
I1<I3>
A1 : C1, I2
C2 : A1, I3
C3 : A2<C2>, I4
A2<C2> : I5, I1<C2>
以图片形式:
写作:
I1<I3> i = new C3();
...导致编译错误“无法转换源类型...到目标类型...“。
为什么?
协变和逆变的泛型参数应该明确地标记为这样。
下面的代码编译没有错误(注意出关键字):
class tmp
{
class C1 {}
interface I2 {}
interface I3 {}
interface I4 {}
interface I5 {}
interface I1<out I3> {}
class A1 : C1, I2 {}
class C2 : A1, I3 {}
class C3 : A2<C2>, I4 {}
class A2<C2> : I5, I1<C2> { }
private void Main()
{
I1<I3> i = new C3();
}
}
当然,不脱离如你描述它失败相同的错误消息的出关键字。
I3不是一个类型,因此不能用作泛型? – CarneyCode 2011-02-14 21:32:35