这是C#4.0编译器中的错误吗?

Edm*_*elo 16 c# compiler-construction object-initializers

这段代码编译成功,但我认为它应该无法编译.此外,当你运行它时,你会得到一个NullReferenceException.丢失的代码是Bar属性初始化中的"新条形图" .

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

class Foo
{
    public Bar Bar { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo
                      {
                          Bar = { Name = "Hello" }
                      };
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个已知的错误?

des*_*sco 41

为什么你认为它不能编译?它是嵌套对象初始化程序语法,客户端代码负责为初始化提供有效值.

从文档:

C#规范7.5.10.2"对象初始化器"

在等号后面指定对象初始值设定项的成员初始值设定项是嵌套对象初始值设定项,即嵌入对象的初始化.而不是为字段或属性分配新值,嵌套对象初始值设定项中的赋值被视为对字段或属性成员的赋值


Isa*_*avo 16

不,这不是一个错误.

如果你希望它运行你要么把new之前Bar(就像你在初始化之前没有为美孚),或者你创建Foo的构造函数的酒吧对象.

对象初始化器基本上只是语法糖.

这个:

var foo = new Foo
            {
                Bar = { Name = "Hello" }
            };
Run Code Online (Sandbox Code Playgroud)

与此完全相同:

var foo = new Foo();
foo.Bar.Name = "Hello"; 
Run Code Online (Sandbox Code Playgroud)