2015-05-06 32 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物件。

相關問題