2015-05-06 27 views
2

当我I 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 documenation,这听起来像一个集合初始基本只是为你处理呼叫Add()。所以 我寻找可能的重载List.Add,但没有找到任何我认为会适用的。

有人可以从C#规范中解释这里发生了什么吗?

+1

Servy有下面的解释,但是你想要做的是:'new List {}' –

+0

或者是'new List ()'更好?也许没关系。我想我今天看到一个问题,关于哪两种选择更好,但我现在无法为我的生活找到它。 –

回答

5

在C#5.0规格的部分7.6.10.2:

甲成员初始指定集合初始化后等号是嵌入式集的初始化。 将初始化程序中给出的元素添加到字段或属性引用的集合中,而不是将新集合分配给字段或属性。该字段或属性的集合类型必须满足第7.6.10.3节中规定的要求。

(重点煤矿)

如此以来,你的集合初始化嵌套在另一个对象/集合初始化器内的行为是它解决它initialzing的值成员,然后将相关项目。在这种情况下,该属性为null,因此null值已解析,并且初始化程序中的所有零项都已添加。如果你真的试图添加一个物品,它会抛出一个NRE,因为你试图将物品添加到null物件。

相关问题