投射列表(其中T:IBar)到ICollection失败

发布于 2024-12-07 18:10:03 字数 346 浏览 2 评论 0原文

我有 classT,实现interfaceIBar

我有一个 List 类型的变量 list

增强我对语言理解的两个问题:

  • 为什么这不起作用?

    var foo = (ICollection)list; // 失败!

  • 如何解决它(如果可能)?

I have classT, implementing interfaceIBar.

I have a variable list of type List<T>.

Two questions for enhancing my understanding of the language:

  • Why doesn't this work?

    var foo = (ICollection <IBar>)list; // fails!

  • How to work around it (if possible)?

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

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

发布评论

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

评论(1

童话 2024-12-14 18:10:04

为什么这不起作用?:var foo = (ICollection)list;

假设 T = Foo 并且有第二个类 Foo2 : IBar

然后你就可以这样继续:

var foolist = (ICollection <IBar>)list;
foolist.Add(new Foo2());  // compiles, since Foo2 also implements IBar

Wham!由于您尝试将 Foo2 添加到 List 中,因此在运行时出现类型冲突。

为了避免这种情况,ICollection 不是 ICollection 的子类型,尽管 FooIBar 的子类型。这背后的理论是 co-和逆变

Why doesn't this work?: var foo = (ICollection <IBar>)list;

Let's say T = Foo and there's a second class Foo2 : IBar.

Then you could continue like this:

var foolist = (ICollection <IBar>)list;
foolist.Add(new Foo2());  // compiles, since Foo2 also implements IBar

Wham! You have a type violation at runtime, since you tried to add a Foo2 to a List<Foo>.

To avoid this, ICollection<Foo> is not a subtype of ICollection<IBar>, even though Foo is a subtype of IBar. The theory behind this is co- and contravariance.

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