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

Cod*_*gue 3 c# constructor object-initializers

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

class MyClass {
  public void DoStuff();
}
Run Code Online (Sandbox Code Playgroud)

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

MyClass mc = new MyClass();
Run Code Online (Sandbox Code Playgroud)

要么:

MyClass mc = new MyClass { };
Run Code Online (Sandbox Code Playgroud)

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

MyClass mc = new MyClass;
Run Code Online (Sandbox Code Playgroud)

das*_*ght 11

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

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

  • +1,虽然这并没有回答隐含的问题"他们为什么设计这种语言?" 但我自己也想不出这个问题的答案......最好的猜测是解析器需要看到parenetheses以识别对方法的引用,知道通过v-table查看,但是,然后,它们必须稍后添加代码以识别同一事物的大括号. (2认同)