这个C#对象初始化程序代码发生了什么?

Jac*_*any 12 c#

这个C#代码发生了什么?我甚至不确定它为什么编译.具体来说,它在设置Class1Prop尝试使用对象初始化器语法的地方发生了什么?它似乎是无效的语法,但它在运行时编译并产生一个空引用错误.

void Main()
{    
    var foo = new Class1
    {
        Class1Prop = 
        {
            Class2Prop = "one"
        }
    };
}

public class Class1
{
    public Class2 Class1Prop { get; set; }
}

public class Class2
{
    public string Class2Prop { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*ray 13

这是C#规范中的对象初始化器语法所允许的,它被称为嵌套对象初始化器.它相当于:

var _foo = new Class1();
_foo.Class1Prop.Class2Prop = "one"
var foo = _foo;
Run Code Online (Sandbox Code Playgroud)

为什么抛出空引用异常应该更明显一些.Class1Prop从未在Class1的构造函数中初始化.

这种语法的好处是调用者可以使用方便的对象初始化器语法,即使属性是getter-only,也只能在嵌套对象上设置可变属性.例如,如果Class1Prop是getter-only属性,则该示例仍然有效.

请注意,创建了一个无法访问的临时变量,以防止在完全初始化运行之前访问字段或数组插槽.