将nullables列表转换为对象列表

时间:2013-07-10 15:37:11

标签: c#

为什么第二次转换失败

InvalidCastException: Unable to cast object of type 'System.Collections.Generic.List`1[System.Nullable`1[System.Boolean]]' to type 'System.Collections.Generic.IEnumerable`1[System.Object]'.
object list1 = new List<string>() { "a", "b" };
object list2 = new List<bool?>() { true, false };

IEnumerable<object> bind1 = (IEnumerable<object>)list1;
IEnumerable<object> bind2 = (IEnumerable<object>)list2;

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:6)

Nullable<T>是一种值类型,而generic covariance不适用于值类型(因此,IEnumerable<int>也不会转换为IEnumerable<object>,例如:)< / p>

  

差异仅适用于参考类型;如果为变量类型参数指定值类型,则该类型参数对于生成的构造类型是不变的。

最简单的解决方法是使用Cast

IEnumerable<object> bind2 = list2.Cast<object>();

答案 1 :(得分:3)

请参阅Jon Skeet's answer了解原因,他会比我更好地解释它。

最简单的解决方法是使用Enumerable.Cast<T>()扩展方法:

using System.Linq;

object list1 = new List<string>() { "a", "b" };
object list2 = new List<bool?>() { true, false };

IEnumerable<object> bind1 = list1.Cast<Object>();
IEnumerable<object> bind2 = list2.Cast<Object>();