首先,你可能已经做了很多更容易:
MyConfusingEnum x1 = 0;
MyConfusingEnum x2 = default(MyConfusingEnum);
MyConfusingEnum x3 = new MyConfusingEnum();
MyConfusingEnum x4 = (MyConfusingEnum) 123;
以上所有工作都很好。(您可能会对第一种方法感到惊讶;有关详细信息,请参见有关隐式枚举转换的规范部分。)
我的问题是为什么编译器允许空定义
首先,用一个问题回答您的问题。您还会拒绝编译器吗?
class C {}
interface I {}
struct S {}
为什么或者为什么不?
更直接地不回答您的问题:“为什么世界没有不同?” 问题很难回答。我将不回答这个不可能的问题,而是回答“假设使空枚举出错,并向设计团队提出了错误;您将如何应对这个问题?” 这个问题仍然是事实,但至少我可以回答。
问题在于,该功能的成本是否可以通过其利益得到证明。
为了工作,必须考虑,设计,指定,实现,测试,记录和交付给客户的语言功能。这是“产生错误”的功能,因此必须将错误消息编写并翻译成数十种语言,文档也必须如此。我花了五分钟的时间来实现该功能,这使许多人获得了很多工作,而他们的收入却很高。
但是,这实际上并不是相关费用。的机会成本是相关成本。预算是有限的,功能不是免费的,因此实现的任何功能都意味着必须削减一些其他功能。您想要削减C#的哪个功能以使用此功能?由于无法做得更好而失去的利益是机会成本。
我还注意到,您提出的功能对任何人都没有明显的好处,这对设计委员会来说是很难的。也许我没有看到引人注目的好处;如果是这样,那是什么?
有没有可能有用的方案?
没有人想到。“拒绝没有明显用处的程序”不是C#的设计目标。