此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; }
}
答案 0 :(得分:13)
在C#规范中,object initializer syntax允许将其称为嵌套对象初始化程序。等效于:
var _foo = new Class1();
_foo.Class1Prop.Class2Prop = "one"
var foo = _foo;
为什么这会引发空引用异常应该更明显。 Class1Prop从未在Class1的构造函数中初始化。
此语法的好处是,即使属性仅是吸气剂,也可以在嵌套对象上设置可变属性,即使调用者可以使用便捷的对象初始化程序语法。例如,如果Class1Prop是仅吸气剂的属性,则该示例仍然有效。
请注意,创建了一个不可访问的临时变量,以防止在运行完全初始化之前访问字段或数组插槽。