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

时间:2015-10-01 22:12:51

标签: c# roslyn c#-6.0

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

public class X
{
    public int A { get; set; }

    public Y B { 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中的新功能吗?我在release notes中没有看到任何提及,所以也许它总是在那里?

2 个答案:

答案 0 :(得分:11)

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

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

总是这样。根据C#5.0语言规范:

  

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

答案 1 :(得分:6)

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

参见第29页的示例。 C# Language 3.0 specification的第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;