我有class
T
,正在执行interface
IBar
。
我有一个list
类型的变量List<T>
。
提高我对语言的理解的两个问题:
为什么这不起作用?
var foo = (ICollection <IBar>)list; // fails!
如何解决它(如果可能)?
我有class
T
,正在执行interface
IBar
。
我有一个list
类型的变量List<T>
。
提高我对语言的理解的两个问题:
为什么这不起作用?
var foo = (ICollection <IBar>)list; // fails!
如何解决它(如果可能)?
为什么这不起作用?:
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
。这背后的理论是协变和逆变。