C# (IEnumerable<;Base>;)派生的解决方案;然而
可能重复:C# (IEnumerable<;Base>;)派生的解决方案;然而,c#,.net,list,ienumerable,C#,.net,List,Ienumerable,可能重复: 当我写varls=(IEnumerable)(cond?lsD1:lsD2)时,我有从B派生的D1和D2我得到一个运行时强制转换错误。IIRC这是一个众所周知的问题。我的问题是 1) 这允许了吗?也许在.NET4中?我有2010年,但我的项目是几个月前,大和目标3.5 2) 有简单的解决方法吗?我只需要阅读列表,不需要添加或删除任何内容。实际上,ToArray()可能会起作用,但还有其他解决方案吗?我认为最好的办法是使用列表上的Cast扩展名。差不多 var ls = cond ?
当我写
varls=(IEnumerable)(cond?lsD1:lsD2)时,我有从B派生的D1和D2代码>我得到一个运行时强制转换错误。IIRC这是一个众所周知的问题。我的问题是
1) 这允许了吗?也许在.NET4中?我有2010年,但我的项目是几个月前,大和目标3.5
2) 有简单的解决方法吗?我只需要阅读列表,不需要添加或删除任何内容。实际上,ToArray()可能会起作用,但还有其他解决方案吗?我认为最好的办法是使用列表上的Cast
扩展名。差不多
var ls = cond ? lsD1.Cast<B>() : lsD2.Cast<B>();
var ls=cond?lsD1.Cast():lsD2.Cast();
我相信您最好的选择是使用列表上的演员阵容扩展。差不多
var ls = cond ? lsD1.Cast<B>() : lsD2.Cast<B>();
var ls=cond?lsD1.Cast():lsD2.Cast();
因此,如果我正确地阅读了您的问题,这是一个示例。C#4支持这一点,因为某些接口IEnumerable就是其中之一
C#3中的解决方法可能是:
var ls = (IEnumerable<B>)(cond ? lsD1.Cast<B>() : lsD2.Cast<B>());
var ls=(IEnumerable)(cond?lsD1.Cast():lsD2.Cast());
将它们转换为数组也会起作用,但这只是因为方差是用于数组的。所以如果我正确地阅读了你的问题,这就是一个例子。C#4支持这一点,因为某些接口IEnumerable就是其中之一
C#3中的解决方法可能是:
var ls = (IEnumerable<B>)(cond ? lsD1.Cast<B>() : lsD2.Cast<B>());
var ls=(IEnumerable)(cond?lsD1.Cast():lsD2.Cast());
将它们转换为数组也会起作用,但这只是因为方差用于数组。在.NET 4中称为协方差,这或多或少是一个重复-在.NET 4中称为协方差,这或多或少是一个重复-