为什么这个继承层次结构不允许这个赋值?

时间:2011-02-14 21:25:28

标签: inheritance c#-4.0 covariance

我有以下复杂的继承层次结构:

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

图片形式:

Inheritance diagram

写作:

I1<I3> i = new C3();

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

为什么?

1 个答案:

答案 0 :(得分:0)

协变和逆变通用参数应明确标记为。

以下代码编译时没有错误(请注意 out 关键字):

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

当然,如果没有 out 关键字,它会失败并显示与您描述的错误消息相同的错误消息。