为什么C#编译器允许空枚举?

八十一团结:

我今天不小心定义了一个不包含任何值的枚举。像这样一个例子:

public enum MyConfusingEnum{}

编译器很高兴让我定义它并成功构建了代码。

现在我显然不能使用传统意义上的代码,因为代码..

var mySadCompiler = MyConfusingEnum;

没有指定值,但有趣的是我能说,..

var myRoundTheHousesZeroState = Activator.CreateInstance<MyConfusingEnum>();

正如我提到的那样,它是一个MyConfusingEnum值为0 的值类型

我的问题是,为什么编译器允许使用空定义,并且在任何情况下它都可能有用?

埃里克·利珀特(Eric Lippert):

首先,你可能已经做了很多更容易:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Sun为什么不使用C#到Java字节码编译器?

为什么Visual Studio C ++编译器拒绝将枚举作为模板参数?

为什么C#编译器会将此!=比较转换为>比较?

为什么C#编译器会对这个嵌套的LINQ查询感到生气?

为什么C#编译器在静态方法调用实例方法的地方不会出错?

ISO C ++ 2003标准中不允许引用引用,但是为什么编译器允许引用呢?

为什么编译器在C ++中允许vector.begin()= vector.end()?

为什么C#编译器无法推断出返回值的类型参数?

C#浮点文字:为什么编译器不默认为左侧变量类型

为什么需要C ++编译器来编译Rust?

为什么C ++编译器允许将extern关键字与定义结合使用?

C#编译器是否在优化可空类型?

为什么C#编译器不能将文字上的负值转换为枚举?

为什么即使使用属性“ SpecialName”,C#编译器也会生成错误

为什么C#编译器不内联MSIL代码?

为什么C ++编译器允许在编译时在堆栈上创建未知大小的数组?

为什么C#编译器认为我在使用可为空的long时尝试使用sbyte重载?

C#编译器会剔除空方法吗?

为什么TypeScript编译器将枚举编译为字典查找而不是简单对象?

为什么编译器允许引用用于C ++中的运行时多态?

为什么C#编译器无法优化简单的异步/等待方法

为什么C编译器允许从uint16_t静默转换为枚举类型?

为什么编译器允许这样做?

为什么C#编译器会在此代码上崩溃?

为什么允许编译器修改r值对象?

为什么C#编译器没有抛出任何错误?

为什么C#编译器说字符串没有`Contains`方法

为什么C#编译器将il代码留给条件方法?

为什么编译器不允许这样做?