Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# (IEnumerable<;Base>;)派生的解决方案;然而_C#_.net_List_Ienumerable - Fatal编程技术网

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中称为协方差,这或多或少是一个重复-