这个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属性,则该示例仍然有效.
请注意,创建了一个无法访问的临时变量,以防止在完全初始化运行之前访问字段或数组插槽.