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