新的C#6对象初始化程序语法?

我刚刚注意到在Visual Studio 2015中编写的C#中可以使用以下内容,但我以前从未见过它:

public class X { public int A { get; set; } public YB { get; set; } } public class Y { public int C {get; set; } } public void Foo() { var x = new X { A = 1, B = { C = 3 } }; } 

我的期望是Foo必须像这样实现:

 public void Foo() { var x = new X { A = 1, B = new Y { C = 3 } }; } 

请注意,无需调用new Y

这是C#6中的新function吗? 我在发行说明中没有看到任何提及,所以也许它一直在那里?

如果运行此代码,您将收到NullReferenceException。

它不会创建Y的实例,它会调用XB属性的getter并尝试为属性C赋值。

它总是像那样工作。 根据C#5.0语言规范:

在等号后面指定对象初始值设定项的成员初始值设定项是嵌套对象初始值设定项,即嵌入对象的初始化。 而不是为字段或属性分配新值,而是将嵌套对象初始值设定项中的赋值视为对字段或属性成员的赋值。

此function在C#3.0中作为对象初始化程序引入。

见第2页的例子。 C#语言3.0规范 169:

 Rectangle r = new Rectangle { P1 = { X = 0, Y = 1 }, P2 = { X = 2, Y = 3 } }; 

效果与…相同

 Rectangle __r = new Rectangle(); __r.P1.X = 0; __r.P1.Y = 1; __r.P2.X = 2; __r.P2.Y = 3; Rectangle r = __r;