带对象初始值设定项的括号

时间:2013-09-27 13:55:27

标签: c# constructor object-initializers

在C#中,我可以有一个类,如:

class MyClass {
  public void DoStuff();
}

我可以像这样初始化这个类:

MyClass mc = new MyClass();

或者:

MyClass mc = new MyClass { };

如果我不需要括号,并且没有对象初始化程序设置的属性,为什么我不能这样做?

MyClass mc = new MyClass;

5 个答案:

答案 0 :(得分:11)

你无法做MyClass mc = new MyClass,因为语言解析器的设计者决定不允许你这样做。事实上,他们相当慷慨地允许一对空花括号:我想他们采取这条路线比明确要求至少一个表达更容易。

您提议的new表达式的结构中没有固有的东西可以禁止这样的语法:修改解析器以支持第三种替代方案不会花费太多精力。但是,这样做会与调用没有参数的非构造函数方法产生不一致。目前,省略括号使得它们在某些上下文中启用了具有特定语义的方法组。很难修改解析器以允许没有括号的无参数方法调用,因为它没有语法标记(注意,当你调用构造函数时,new关键字扮演这样一个标记的角色)。

答案 1 :(得分:3)

因为语法new MyClass { }是新的无参数构造函数语法,所以您可以省略()。构造函数方法public MyClass()由推理调用。

但是,这种语法new MyClass很糟糕,因为编译器不接受它有效。

并不是他们不能这样做,他们可以对编译器做任何事情,但他们没有这样做。

答案 2 :(得分:3)

考虑一下:

public class MyClass {

    public int Value { get; private set; }

    public MyClass With(int i) {
        Value = i;
        return this;
    }
}

MyClass my = new MyClass().With(5);    // Old-school
MyClass my1 = new MyClass { }.With(6); // Kind of funky looking, but okay.
MyClass my2 = new MyClass.With(4);     // This looks just like a static method call except for the new

答案 3 :(得分:0)

因为MyClass是类名/类型,MyClass()是构造函数;你需要(想要)调用的是构造函数。

答案 4 :(得分:0)

这是因为您正在调用要初始化的对象的默认构造函数。这就是为什么,你使用:

MyClass mc = new MyClass();

你可以尝试,如果没有默认构造函数(它接受零参数),这一行会给出一个错误,比如“没有默认构造函数存在”。