2015-12-22 69 views
1

當我聲明一個集合初始值設定項時,我的速度有點快,並且以編譯的東西結束,但運行時失敗。我的問題是我寫的是什麼,爲什麼編譯?這個測試重現該問題:收集初始值設定項,編譯但拋出異常

[TestFixture] 
public class ExploratoryTests 
{ 
    [Test, Ignore] 
    public void Test() 
    { 
     try 
     { 
      var test = new TestClass 
      { 
       ListOfStrings = { "hello", "world", "!" } 
      }; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
    public class TestClass 
    { 
     public List<string> ListOfStrings { get; set; } 
    }  
} 

這將打印錯誤:對象引用不設置到對象的實例。 我的意思是用new List<string> { "hello", "world", "!" }初始化ListOfStrings。這運行良好。

我已經嘗試過搜索,但我不知道這個結構被稱爲什麼。我搜索了一些沒有運氣的C#書籍。我尋求的幫助是這個構造的一個名稱,並且是一個解釋它應該用於什麼以及爲什麼編譯的指針的指針。

在此先感謝! :)

+0

封面的背後,你的財產清單 ListOfStrings指指向一些內存。當你不用new關鍵字進行初始化時,指針要麼包含一個無效值,要麼指向尚未分配的內存(這就是錯誤信息試圖告訴你的)。它編譯是因爲它沒有真正嘗試寫入該內存位置,直到運行該程序。 – Duston

+0

@Duston,「指針」等是完全錯誤的詞彙表,因爲我們正在談論託管語言。 –

回答

2

的代碼你在這裏:

var test = new TestClass 
{ 
    ListOfStrings = { "hello", "world", "!" } 
}; 

等效於此:

var test = new TestClass(); 
test.ListOfStrings.Add("hello"); 
test.ListOfStrings.Add("world"); 
test.ListOfStrings.Add("!"); 

ListOfStringsnull

如果你的類是這樣的,而不是定義,你不會得到任何錯誤:

public class TestClass 
{ 
    public List<string> ListOfStrings { get; set; } 
    public TestClass() 
    { 
     ListOfStrings = new List<string>(); 
    } 
}  
+0

你當然是正確的,但你能提供的原因(spec-wise)'新TestClass {ListOfStrings = {「你好」,「世界」,「!」 }}'與新TestClass不同{ListOfStrings = new List {「hello」,「world」,「!」 }}'? –

+0

對象初始化程序根據上例(第二個代碼塊)簡單地分配屬性。在不創建'新列表'的情況下,'ListOfStrings'引用爲空 - 您無法在空引用上調用方法。不要忘記對象初始值設定項只是一些操作的語法糖 – Charleh

+0

@Charleh,它們都是「對象初始值設定項」。 –

相關問題