为什么C#静态构造函数需要括号?

考虑:

class Foo { static Foo() { // Static initialisation } } 

为什么static Foo() {...}需要static Foo() {...} ? 静态构造函数必须始终是无参数的,为什么要这么麻烦? 它们是否有必要避免一些解析器模糊,或者只是为了保持与常规无参数构造函数的一致性?

由于它看起来非常像初始化块,我经常发现自己意外地将它们排除在外,然后不得不考虑几秒钟的错误。 如果他们可以以同样的方式被淘汰将是很好的。

我经常遇到这样的问题; 也就是说,“编译器可能会发现这个东西丢失了,那么为什么需要呢?” 以下是此类问题的另一个示例:

C#在静态类中使用consts

正如我在那个问题中所指出的,基本上我们在这种情况下有三种选择。 使所需的冗余文本,使其成为可选,或使其成为非法。

每个都有自己的缺点。

使其成为必需的缺点是您最终会在语言中出现不必要的冗余。

使它成为可选项的缺点是你会混淆那些认为两种forms之间必须存在差异的人。 此外,您使错误恢复解析器更难以完成其工作; 它在冗余方面蓬勃发展。 并且您可能会在将来添加新的语言function时更加困难,因为已经声称更多的“语法区域”。

使它成为非法的缺点是你做了一个“陷阱”,用户必须记住哦,是的,我应该把parens放在这里,但不是在这里。

拟议的特征最好有一个上行支付下行。 在我看来,最小的缺点是第一个:让它成为必需品。 其他选择我希望有一个好处,certificate下行,我在这里没有看到一个。

因为它是一个静态构造函数 ,所以它是static +看起来很正常的构造函数。

一致性是关键。 🙂

我认为这是为了消除歧义:它使解析器的工作更容易,将代码块识别为构造函数子例程 (不考虑static ); 相反,它有助于确保人类作者/维护者通过强制他们使用特定的类似方法的语法来了解选择此特定构造的含义。