2011-02-14 91 views
0

我有以下的复杂的继承层次:为什么这个继承层次不允许这个赋值?

I1<I3> 
A1 : C1, I2 
C2 : A1, I3 
C3 : A2<C2>, I4     
A2<C2> : I5, I1<C2> 

以图片形式:

Inheritance diagram

写作:

I1<I3> i = new C3(); 

...导致编译错误“无法转换源类型...到目标类型...“。

为什么?

+0

I3不是一个类型,因此不能用作泛型? – CarneyCode 2011-02-14 21:32:35

回答

0

协变和逆变的泛型参数应该明确地标记为这样。

下面的代码编译没有错误(注意关键字):

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(); 
    } 
} 

当然,不脱离如你描述它失败相同的错误消息的关键字。

相关问题