我今天不小心定义了一个不包含任何值的枚举。像这样一个例子:
public enum MyConfusingEnum{}
编译器很高兴让我定义它并成功构建了代码。
现在我显然不能使用传统意义上的代码,因为代码..
var mySadCompiler = MyConfusingEnum;
没有指定值,但有趣的是我很能说,..
var myRoundTheHousesZeroState = Activator.CreateInstance<MyConfusingEnum>();
正如我提到的那样,它是一个MyConfusingEnum
值为0 的值类型;
我的问题是,为什么编译器允许使用空定义,并且在任何情况下它都可能有用?
首先,你可能已经做了很多更容易:
MyConfusingEnum x1 = 0;
MyConfusingEnum x2 = default(MyConfusingEnum);
MyConfusingEnum x3 = new MyConfusingEnum();
MyConfusingEnum x4 = (MyConfusingEnum) 123;
以上所有工作都很好。(您可能会对第一种方法感到惊讶;有关详细信息,请参见有关隐式枚举转换的规范部分。)
我的问题是为什么编译器允许空定义
首先,用一个问题回答您的问题。您还会拒绝编译器吗?
class C {}
interface I {}
struct S {}
为什么或者为什么不?
更直接地不回答您的问题:“为什么世界没有不同?” 问题很难回答。我将不回答这个不可能的问题,而是回答“假设使空枚举出错,并向设计团队提出了一个错误;您将如何应对这个问题?” 这个问题仍然是事实,但至少我可以回答。
问题在于,该功能的成本是否可以通过其利益得到证明。
为了工作,必须考虑,设计,指定,实现,测试,记录和交付给客户的语言功能。这是“产生错误”的功能,因此必须将错误消息编写并翻译成数十种语言,文档也必须如此。我花了五分钟的时间来实现该功能,这使许多人付出了很多时间,而这些人的收入却很高。
但是,这实际上并不是相关费用。的机会成本是相关成本。预算是有限的,功能不是免费的,因此实现的任何功能都意味着必须削减一些其他功能。您想要削减C#的哪个功能以使用此功能?由于无法做得更好而失去的利益是机会成本。
我还注意到,您提出的功能对任何人都没有明显的好处,这对设计委员会来说是一个艰难的选择。也许我没有看到引人注目的好处。如果是这样,那是什么?
有没有可能有用的方案?
没有人想到。“拒绝没有明显用处的程序”不是C#的设计目标。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句