1

我有classT,正在执行interfaceIBar

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

提高我对语言的理解的两个问题:

  • 为什么这不起作用?

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

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

4

1 回答 1

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

哇!您在运行时存在类型冲突,因为您尝试将 a 添加Foo2到 a List<Foo>

为了避免这种情况,ICollection<Foo>is不是的子类型ICollection<IBar>,即使Foo是 的子类型IBar。这背后的理论是协变和逆变

于 2011-09-29T12:17:39.767 回答