为什么不编译?

时间:2016-03-25 13:24:03

标签: 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);
    }
}

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

  

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

但为什么呢?

One& Une都是常量。即它们可以在编译时计算,因此它就变成了 Foo f = 0。由于0是任何enum的有效值,为什么不编译?

1 个答案:

答案 0 :(得分:7)

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

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

  

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

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

我想知道为什么规范说"十进制"。这意味着hexadecimal-integer-literal未包含在内,因此0x0也不应该有效。