将List <t>(其中T:IBar)转换为ICollection <ibar>失败</ibar> </t>

时间:2011-09-29 12:12:02

标签: c# list interface casting icollection

我有class T ,正在实施interface IBar

我有list类型的变量List<T>

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

  • 为什么这不起作用?

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

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

1 个答案:

答案 0 :(得分:5)

  

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

让我们说T = Foo,然后是第二课Foo2 : IBar

然后你可以继续这样:

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

威猛!您在运行时遇到类型违规,因为您尝试将Foo2添加到List<Foo>

要避免这种情况,ICollection<Foo> ICollection<IBar>的子类型,即使FooIBar的子类型。这背后的理论是co- and contravariance