为什么不编译?

Sna*_*ake 7 c# enums

我今天偶然发现了这个奇怪的事情:

http://www.yoda.arachsys.com/csharp/teasers.html

问题#5.

代码:

using System;

class Test
{
    enum Foo
    {
        Bar,
        Baz
    };

    const int One = 1;
    const int Une = 1;

    static void Main()
    {
        Foo f = One - Une;
        Console.WriteLine(f);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在根据问题#5的http://www.yoda.arachsys.com/csharp/teasers-answers.html上的答案

...这是一个已知的错误,因为过早地进行了一些优化,收集0的常量并认为任何已知的0常量都应该可以转换为任何枚举的0值.它现在和我们在一起,并且不太可能被修复,因为它可能会破坏一些在技术上非法但工作得非常好的代码.当然,规范可能会改变.

但为什么?

One&Une都是const.即它们可以在编译时计算,因此它就变成了 Foo f = 0.既然0是任何一个有效的值enum,为什么不编译呢?

usr*_*usr 7

问题不在于编译器能够或不能使该程序工作.问题是:语言规范需要做什么?

此行为是规范的偏差,因此它是编译器错误.

6.1.3隐式枚举转换隐式枚举转换允许将decimal-integer-literal 0转换为任何枚举类型,并转换为其基础类型为枚举类型的任何可空类型.

所以它必须是文字.1-1不是字面上的零.0字面上为零.

我想知道为什么规范说"十进制".这意味着hexadecimal-integer-literal不包括在内0x0也不应该工作.