添加null到List <bool?>强制转换为IList抛出异常</bool?>

时间:2009-12-16 00:53:15

标签: c# .net

使用.NET 3.5和C#3.0,

IList list = new List<bool?>();
list.Add(null);

抛出一个ArgumentException,感觉不对。

List<bool?> list = new List<bool?>();
list.Add(null);

完美无缺。

这是微软代码中的错误吗?

在现实生活中如何产生这种错误的一个例子:

new JavaScriptSerializer().Deserialize<List<bool?>>("[true, false, null]");

6 个答案:

答案 0 :(得分:14)

是的,确实如此。有关其他报告,请参阅http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/abc99fb5-e218-4efa-8969-3d96f6021cee/。基本上,当您通过其弱类型的IList实现访问List<bool?>时,它会在尝试将项目添加到内部存储之前进行一些类型检查 - 并且它会为可以为空的类型检查此类型是否错误。

答案 1 :(得分:3)

这是“按设计”而且明确如此。原因是List<T>具有IList的明确实现。它过滤传递给各种方法的值以进行一些空检查。逻辑基本上是以下

if (default(T) != null && value == null) { throw ... }

在这种情况下,值类型的默认值(和可以为值的类型)不为空,因此不允许。

答案 2 :(得分:1)

哈!那是一个有趣的。我认为它与可疑的bool严格来说是作为结构实现的想法有关,IList期望一个对象,也许它期望包装bool或其他东西。 Jon Skeet你在哪儿?我们需要你! (轻拍红宝石拖鞋3次)

答案 3 :(得分:1)

当您使用空值在IList上调用Add方法时,它是您传递给方法的空引用,而不是可以为空的值。无法将null引用转换为可空值。

Add方法需要包含boolbool?的内容。由于您无法设置空值,因此无法创建可用于向IList添加空值的对象。

如果您使用通用接口IList<bool?>,则添加值没有问题:

IList<bool?> list = new List<bool?>();
list.Add(null);

答案 4 :(得分:0)

正如已经指出的那样,.NET 3.5中的列表<T>类中的IList.Add(对象项)方法的实现存在一个错误(可能之前)。问题是,IList.Add(对象项)方法试图验证对象,我们尝试添加的是一个与List <T>泛型类型参数兼容的对象,当我们尝试将null添加到可空值类型列表中。

我的解决方法涉及通过从List对象获取和调用Add(T item)方法进行反射。

IList list = new List<bool?>();
MethodInfo addMethod = list.GetType().GetMethod("Add");
addMethod.Invoke(list, new object[] { null });

答案 5 :(得分:-1)

您正在将通用List<T>与非通用IList混合使用。 List<T>继承自IList<T>,而不是IList