列表属性的空集合初始值设定项结果为null
当我运行此代码时 ,它不会像我期望的那样将ThisIsAList
初始化为空集合…而是ThisIsAList
为null。
void Main() { var thing = new Thing { ThisIsAList = {} }; Console.WriteLine(thing.ThisIsAList == null); // prints "True" } public class Thing { public List ThisIsAList { get; set; } }
为什么这不是编译错误? 为什么结果为null
?
我想知道是否可能存在隐式转换,但以下尝试产生了编译错误:
thing.ThisIsAList = Enumerable.Empty().ToArray(); List integers = { 0, 1, 2, 3 };
根据关于集合初始化程序的 MSDN文档,听起来像集合初始化程序基本上只是处理为你调用Add()
。 所以我查找了List.Add
可能重载,但没有发现我认为适用的任何内容。
有人可以从C#规范解释这里发生了什么吗?
在C#5.0规范的7.6.10.2节中:
在等号后面指定集合初始值设定项的成员初始值设定项是嵌入式集合的初始化。 而不是将新集合分配给字段或属性,初始化程序中给出的元素将添加到字段或属性引用的集合中 。 字段或属性必须是满足§7.6.10.3中指定要求的集合类型。
(强调我的)
因此,由于您的集合初始值设定项嵌套在另一个对象/集合初始值设定项中,因此行为是它将初始化的成员解析为值,然后添加相关项。 在这种情况下,属性为null
,因此解析了null
值,并添加了初始值设定项中的所有零项。 如果你真的试图添加一个项目,它会抛出一个NRE,因为你试图将一个项目添加到一个null
对象。