投射列表(其中T:IBar)到ICollection失败
我有 class
T
,实现interface
IBar
。
我有一个 List
类型的变量 list
。
增强我对语言理解的两个问题:
为什么这不起作用?
var foo = (ICollection
)list; // 失败! 如何解决它(如果可能)?
I have class
T
, implementing interface
IBar
.
I have a variable list
of type List<T>
.
Two questions for enhancing my understanding of the language:
Why doesn't this work?
var foo = (ICollection <IBar>)list; // fails!
How to work around it (if possible)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
假设
T = Foo
并且有第二个类Foo2 : IBar
。然后你就可以这样继续:
Wham!由于您尝试将
Foo2
添加到List
中,因此在运行时出现类型冲突。为了避免这种情况,
ICollection
不是ICollection
的子类型,尽管Foo
是IBar
的子类型。这背后的理论是 co-和逆变。Let's say
T = Foo
and there's a second classFoo2 : IBar
.Then you could continue like this:
Wham! You have a type violation at runtime, since you tried to add a
Foo2
to aList<Foo>
.To avoid this,
ICollection<Foo>
is not a subtype ofICollection<IBar>
, even thoughFoo
is a subtype ofIBar
. The theory behind this is co- and contravariance.