【发布时间】:2011-09-29 12:12:02
【问题描述】:
我有classT,实现interfaceIBar。
我有一个 list 类型的变量 List<T>。
增强我对语言理解的两个问题:
-
为什么这不起作用?
var foo = (ICollection <IBar>)list; // fails! 如何解决(如果可能)?
【问题讨论】:
标签: c# list interface casting icollection
我有classT,实现interfaceIBar。
我有一个 list 类型的变量 List<T>。
增强我对语言理解的两个问题:
为什么这不起作用?
var foo = (ICollection <IBar>)list; // fails!
如何解决(如果可能)?
【问题讨论】:
标签: c# list interface casting icollection
为什么这不起作用?:
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> 的子类型,尽管Foo 是IBar 的子类型。这背后的理论是co- and contravariance。
【讨论】: