3

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

class MyClass {
  public void DoStuff();
}

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

MyClass mc = new MyClass();

或者:

MyClass mc = new MyClass { };

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

MyClass mc = new MyClass;
4

5 回答 5

11

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

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

于 2013-09-27T13:58:05.867 回答
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
于 2013-09-27T14:03:25.683 回答
3

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

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

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

于 2013-09-27T13:57:08.800 回答
0

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

MyClass mc = new MyClass();

您可以尝试,如果不存在默认构造函数(其参数数量为零),则此行将给出错误,例如“不存在默认构造函数”。

于 2013-09-27T14:01:25.487 回答
0

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

于 2013-09-27T13:57:12.207 回答