带有对象初始值设定项的括号
本文关键字:对象 | 更新日期: 2023-09-27 18:32:59
在 C# 中,我可以有一个类,例如:
class MyClass {
public void DoStuff();
}
我可以像这样初始化这个类:
MyClass mc = new MyClass();
或:
MyClass mc = new MyClass { };
如果我不需要括号,并且对象初始值设定项没有要设置的属性,为什么我不能这样做?
MyClass mc = new MyClass;
你不能
做MyClass mc = new MyClass
,因为语言解析器的设计者决定不允许你这样做。事实上,他们相当慷慨地允许一对空的花括号:我想他们走这条路比明确要求至少一个表情更容易。
您提出的new
表达式的结构中没有任何固有的东西会禁止这种语法:修改解析器以支持第三种替代方法不会花费太多精力。但是,这样做会与调用没有参数的非构造函数方法不一致。目前,省略括号会使它们成为在某些情况下启用特定语义的方法组。很难修改解析器以允许不带括号的无参数方法调用,因为它没有语法标记(请注意,当您调用构造函数时,new
关键字扮演此类标记的角色)。
因为语法new MyClass { }
是新的无参数构造函数语法,这就是为什么你可以省略()
。构造函数方法public MyClass()
通过推理调用。
但是,这种语法new MyClass
很糟糕,因为编译器不接受它为有效。
这并不是说他们做不到,他们可以用编译器做任何事情,但他们没有这样做。
考虑一下:
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
因为 MyClass 是类名/类型,MyClass() 是构造函数;你需要(想要)调用的是构造函数。
这是因为您正在为要初始化的对象调用默认构造函数。这就是为什么,你使用:
MyClass mc = new MyClass();
你可以试试,如果没有默认构造函数(它需要零个参数)存在,这一行会给出一个错误,说"不存在默认构造函数"。