为什么这个继承层次结构不允许这种分配?

发布于 2024-10-17 09:13:43 字数 355 浏览 4 评论 0原文

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

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

以图片形式:

继承图

写入:

I1<I3> i = new C3();

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

为什么?

I have the following complex inheritance hierarchy:

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

In picture form:

Inheritance diagram

Writing:

I1<I3> i = new C3();

...results in the compilation error "Cannot convert source type... to target type...".

Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最舍不得你 2024-10-24 09:13:43

协变和逆变泛型参数应明确标记为此类。

以下代码编译时不会出现错误(请注意 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 关键字,它将失败并显示与您所描述的相同的错误消息。

Covariant and contravariant generic parameters should be explicitly marked as such.

The following code compiles without error (note the out keyword):

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

Of course, without the out keyword it fails with the same error message as you described.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文