使用.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]");
答案 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方法需要包含bool
或bool?
的内容。由于您无法设置空值,因此无法创建可用于向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
。