我有 class
<强> T
,实现interface
<强> IBar
.
我有一个变量 list
类型 List<T>
.
提高我对语言的理解的两个问题:
为什么这行不通?
var foo = (ICollection <IBar>)list; // fails!
如何解决(如果可能)?
最佳答案
Why doesn't this work?:
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 .
关于c# - 转换列表<T>(其中 T : IBar) to ICollection<IBar> fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597136/