编译器接受抛出NullReferenceException的几乎对象初始化器

sha*_*tor 3 c# object-initializers

可能重复:
初始化程序语法

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

class A
{
    public string Name { get; set; }
}

class B
{
    public A a { get; set; }
}

// OK
A a = new A { Name = "foo" };
// Using collection initialiser syntax fails as expected:
// "Can only use array initializer expressions to assign
// to array types. Try using a new expression instead."
A a = { Name = "foo" };

// OK
B b = new B { a = new A { Name = "foo" } };
// Compiles, but throws NullReferenceException when run
B b = new B { a = { Name = "foo" } };
Run Code Online (Sandbox Code Playgroud)

我很惊讶地看到最后一行编译并且认为我在运行时看到它爆炸之前发现了一个漂亮的(虽然不一致)快捷方式.最后一次使用是否有任何实用性?

Jon*_*eet 5

最后一行被翻译为:

B tmp = new B();
tmp.a.Name = "foo";
B b = tmp;
Run Code Online (Sandbox Code Playgroud)

是的,它肯定有实用性 - 当新创建的对象具有返回可变类型的只读属性时.类似的东西最常见的用途可能是收藏品:

Person person = new Person {
    Friends = {
        new Person("Dave"),
        new Person("Bob"),
    }
}
Run Code Online (Sandbox Code Playgroud)

这将从中获取朋友列表Person并向其添加两个新人.