【问题标题】:Casting a List<T> (where T : IBar) to ICollection<IBar> fails将 List<T>(其中 T : IBar)转换为 ICollection<IBar> 失败
【发布时间】:2011-09-29 12:12:02
【问题描述】:

我有classT,实现interfaceIBar

我有一个 list 类型的变量 List&lt;T&gt;

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

  • 为什么这不起作用?

    var foo = (ICollection &lt;IBar&gt;)list; // fails!

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

【问题讨论】:

    标签: c# list interface casting icollection


    【解决方案1】:

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

    假设T = Foo,还有第二类Foo2 : IBar

    然后你可以这样继续:

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

    哇!您在运行时存在类型冲突,因为您尝试将 Foo2 添加到 List&lt;Foo&gt;

    为避免这种情况,ICollection&lt;Foo&gt;不是ICollection&lt;IBar&gt; 的子类型,尽管FooIBar 的子类型。这背后的理论是co- and contravariance

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2021-12-02
      相关资源
      最近更新 更多