将可为null的列表转换为对象列表

本文关键字:列表 转换 对象 null | 更新日期: 2023-09-27 18:21:55

为什么的第二次转换失败

InvalidCastException:无法将类型为"System.Collections.Generic.List `1[System.Nullable `1[System.Boolean]]"的对象强制转换为类型"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;

任何想法都将不胜感激。

将可为null的列表转换为对象列表

Nullable<T>是一种值类型,泛型协方差不适用于值类型(例如,也没有从IEnumerable<int>IEnumerable<object>的转换):

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

最简单的修复方法是使用Cast:

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

看看Jon Skeet的答案,他会比我解释得更好。

最简单的修复方法是使用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>();