可能重复:
C# Cannot convert from IEnumerable<Base> to IEnumerable<Derived>
我有从D2派生的D1和D2。当我写var ls = (IEnumerable<B>)(cond?lsD1:lsD2);
时,我得到一个运行时转换错误。 IIRC这是一个众所周知的问题。我的问题是
1)这是允许的吗?也许在.NET 4?我有2010年,但我的项目有几个月大,目标是3.5。
2)有一个简单的解决方法吗?我只需要阅读列表不添加任何内容或删除。实际上,ToArray()可能会有效,但还有另一种解决方案吗?
答案 0 :(得分:2)
我认为您最好的选择是在列表中使用Cast<T>
扩展名。像
var ls = cond ? lsD1.Cast<B>() : lsD2.Cast<B>();
答案 1 :(得分:2)
因此,如果我正确地阅读了您的问题,这就是covarience的一个例子。 C#4支持一些接口IEnumerable就是其中之一。
C#3中的解决方法可能类似于:
var ls = (IEnumerable<B>)(cond ? lsD1.Cast<B>() : lsD2.Cast<B>());
将它们转换为数组也可以,但只是因为数组的方差为"broken" (see section: Broken array variance)。