【发布时间】:2011-02-17 15:07:17
【问题描述】:
我并不完全相信这是可能的,但是就这样吧。我有一个返回对象的方法,尽管实际类型是 Collection。现在,我可以轻松地将对象投射到集合中使用
var myCollection = myObject as Collection<MyClassA>;
但是我遇到的问题是Collection<MyClassA> 也可以是Collection<MyClassB> 或Collection<MyClassC>。所有这些MyClassX 都继承自MyBaseClass,所以理想情况下我希望能够做类似的事情
var myCollection = myObject as Collection<MyBaseClass>;
但是,这会在强制转换时引发异常。无论如何都可以这样做吗?我知道它可能在 .Net 4 内?
感谢您的帮助。
编辑: 好的 - 到目前为止的答案非常有用,但是它们只解决了解决方案的第二部分 - 转换/转换集合。
我仍然不确定最初应该如何将对象转换为集合(不为每种可能的类型使用巨大的 if 语句)
【问题讨论】:
-
这是 C# 4.0 的特性,与 .NET 4.0 无关。
-
@John:无论是 .NET4 还是 C#4 的功能,您都无法转换为
Collection<MyBaseClass>。 -
Casting List<T> - covariance/contravariance problem 的可能副本。请阅读 Jon Skeet 的回答,它将完全符合您的情况。
-
@LukeH:我知道协变和逆变只适用于接口和委托。当我说“它是”一个 C# 4.0 特性时,我假设 OP 正在考虑 C# 4.0 的协变和逆变特性,它们不是 .NET 特性。
-
@John:我以为你会意识到这一点。我的评论实际上只是为了 OP 的利益,以防他们误解您的评论,说在 C#4 中可以转换为
Collection<MyBaseClass>。但是(这是一个真正的挑剔)自从 C#4 作为 .NET4 的一部分发布以来,我可以合理地说 C#4 中的差异是 .NET4 功能集的一部分。