我有class
T
,正在实施interface
IBar
。
我有list
类型的变量List<T>
。
增强我对语言理解的两个问题:
为什么这不起作用?
var foo = (ICollection <IBar>)list; // fails!
如何解决(如果可能)?
答案 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>
的子类型,即使Foo
是IBar
的子类型。这背后的理论是co- and contravariance。