2011-08-23 72 views
3

可能重複:
Initializer syntax編譯器接受幾乎對象初始化拋出的NullReferenceException

短代碼示例演示(VS2010 SP1,64位的Win7):

class A 
{ 
    public string Name { get; set; } 
} 

class B 
{ 
    public A a { get; set; } 
} 

// OK 
A a = new A { Name = "foo" }; 
// Using collection initialiser syntax fails as expected: 
// "Can only use array initializer expressions to assign 
// to array types. Try using a new expression instead." 
A a = { Name = "foo" }; 

// OK 
B b = new B { a = new A { Name = "foo" } }; 
// Compiles, but throws NullReferenceException when run 
B b = new B { a = { Name = "foo" } }; 

我很驚訝地看到最後一行編譯並認爲我找到了一個漂亮的(儘管不一致帳篷)在看到它在運行時炸燬的捷徑。最後一次使用是否有用途?

+1

我以前問過。 – leppie

+0

@leppie所以你做到了!也可以關閉這一個。 – shambulator

回答

5

最後一行被翻譯成:

B tmp = new B(); 
tmp.a.Name = "foo"; 
B b = tmp; 

是的,很肯定有實用 - 當新創建的對象具有只讀屬性返回可變類型。的類似的東西,最常見的用途是可能是收藏品,但:

Person person = new Person { 
    Friends = { 
     new Person("Dave"), 
     new Person("Bob"), 
    } 
} 

這將Person好友列表,並添加了兩個新的人吧。