C# 编译器几乎接受抛出NullReferenceException的对象初始值设定项

C# 编译器几乎接受抛出NullReferenceException的对象初始值设定项,c#,object-initializers,C#,Object Initializers,可能重复: 要演示的简短代码示例(VS2010 SP1,64位Win7): A类 { 公共字符串名称{get;set;} } B类 { 公共A{get;set;} } //嗯 A=新的A{Name=“foo”}; //使用集合初始化器语法失败,如预期: //“只能使用数组初始值设定项表达式来分配 //要更改数组类型,请尝试改用新表达式。“ A={Name=“foo”}; //嗯 B=新B{a=新a{Name=“foo”}; //编译,但在运行时引发NullReferenceException

可能重复:

要演示的简短代码示例(VS2010 SP1,64位Win7):

A类
{
公共字符串名称{get;set;}
}
B类
{
公共A{get;set;}
}
//嗯
A=新的A{Name=“foo”};
//使用集合初始化器语法失败,如预期:
//“只能使用数组初始值设定项表达式来分配
//要更改数组类型,请尝试改用新表达式。“
A={Name=“foo”};
//嗯
B=新B{a=新a{Name=“foo”};
//编译,但在运行时引发NullReferenceException
B=新的B{a={Name=“foo”};

我惊讶地看到最后一行代码被编译,并认为在看到它在运行时崩溃之前,我已经找到了一个漂亮(尽管不一致)的快捷方式。最后一次使用是否有用?

最后一行被转换为:

B tmp = new B();
tmp.a.Name = "foo";
B b = tmp;
是的,当新创建的对象具有返回可变类型的只读属性时,它肯定具有实用性。最常见的类似用法可能是用于收藏:

Person person = new Person {
    Friends = {
        new Person("Dave"),
        new Person("Bob"),
    }
}

这将从
Person
中获取好友列表,并向其中添加两个新好友。

@leppie你就是这么做的!不妨把这个关上。