Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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# 将null添加到列表中<;布尔?>;强制转换为引发异常的IList_C#_.net - Fatal编程技术网

C# 将null添加到列表中<;布尔?>;强制转换为引发异常的IList

C# 将null添加到列表中<;布尔?>;强制转换为引发异常的IList,c#,.net,C#,.net,使用.NET3.5和C#3.0 IList list=new list(); list.Add(空); 这会抛出一个ArgumentException,这感觉不对 List<bool?> list = new List<bool?>(); list.Add(null); List List=新列表(); list.Add(空); 工作完美 那么,这是微软代码中的错误吗 如何在现实生活中产生此类错误的示例: new JavaScriptSerializer().Des

使用.NET3.5和C#3.0

IList list=new list();
list.Add(空);
这会抛出一个ArgumentException,这感觉不对

List<bool?> list = new List<bool?>();
list.Add(null);
List List=新列表();
list.Add(空);
工作完美

那么,这是微软代码中的错误吗

如何在现实生活中产生此类错误的示例:

new JavaScriptSerializer().Deserialize<List<bool?>>("[true, false, null]");
newJavaScriptSerializer()。反序列化(“[true,false,null]”);

您将通用
列表与非通用
IList混用<代码>列表
继承自
IList
,而非
IList

是的,它是。有关其他报告,请参阅。基本上,当您通过其弱类型的IList实现访问
列表时,它会在尝试将项添加到内部存储器之前进行一些类型检查——对于可为空的类型,这种类型检查是错误的。

Ha!真有趣。我相信这与以下想法有关:严格来说,可空bool是作为一个结构实现的,而IList需要一个对象,也许它需要一个bool或其他东西。乔恩·斯基特你在哪里?我们需要你!(轻敲红宝石拖鞋3次)

这是“设计”的,而且非常明确。原因是
List
有一个显式实现
IList
。它过滤传递给各种方法的值,以执行一些空检查。基本逻辑如下

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

在这种情况下,值类型(可为null的值类型)的默认值不为null,因此不允许使用该值。

使用null值调用
IList
上的Add方法时,传递给该方法的是null引用,而不是可为null的值。无法将null引用转换为可为null的值

Add方法需要包含
bool
bool?
的内容。由于无法框选空值,因此无法创建可用于将空值添加到
IList
的对象

如果改用通用接口IList
,则添加值没有问题:

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

正如已经指出的,在.NET 3.5(可能更早)中的List
类中的IList.Add(对象项)方法的实现中存在一个错误。问题是,IList.Add(object item)方法尝试验证我们尝试添加的对象是否与List
泛型类型参数兼容,当我们尝试将null添加到可为null的值类型列表时,该参数会失败

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

IList list = new List<bool?>();
MethodInfo addMethod = list.GetType().GetMethod("Add");
addMethod.Invoke(list, new object[] { null });
IList list=new list();
MethodInfo addMethod=list.GetType().GetMethod(“添加”);
Invoke(列表,新对象[]{null});

我假设您的意思是您的第一个IList是IList(T)From,public class List(T):IList(T),ICollection(T),IEnumerable(T),IList,ICollection,IEnumerable(将尖括号改为圆括号),它正确地从这两个列表继承。默认值(bool?=(bool?)为null。答案是“是的,这实际上是一个bug”,一次而不是一次“不,你在这里搞砸了…”细细品味这一刻…:DSadly,在这种情况下,这是行不通的。这方面的一个例子是使用新的JavaScriptSerializer().Deserialize(“[true,false,null]”)供参考:Visual Studio 2010 beta 2,FrameWork 4.0(而不是客户端4.0):(必须包括引用:using System.Collections):IList list=new list();list.Add(null);编译,并在运行时:在执行后设置断点,打开命令窗口并执行?list[0]打印出“null”。有趣的是,它在Mono中工作。
IList list = new List<bool?>();
MethodInfo addMethod = list.GetType().GetMethod("Add");
addMethod.Invoke(list, new object[] { null });