C# 为什么不应该';这不是编译吗?

C# 为什么不应该';这不是编译吗?,c#,enums,C#,Enums,今天我偶然发现了一件奇怪的事情: 问题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); } } 现在

今天我偶然发现了一件奇怪的事情:

问题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);
    }
}
现在根据问题5的答案

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

但是为什么呢

One
Une
都是常量。也就是说,它们可以在编译时计算,因此
Foo f=0
。既然
0
是任何
enum
的有效值,为什么不编译它呢

问题不在于编译器能否使该程序工作。问题是:语言规范要求做什么

此行为与规范有偏差,因此是编译器错误

6.1.3隐式枚举转换 隐式枚举转换允许将十进制整数文本0转换为任何枚举类型以及基础类型为枚举类型的任何可空类型

所以它一定是一个文字<代码>1-1不是文字零<代码>0为文字零


我想知道为什么说明书上写着“十进制”。这意味着不包括
十六进制整数文本
,因此
0x0
也不应该工作。

您正在寻找类似的
Foo f
,然后
f.Bar=One-Une对吗?因为可能在常量计算之前完成了检查“它是一个常量整数吗?如果是,它是0吗?那么隐式将其强制转换为枚举是可以的”。键入safety。即使您的枚举由int支持,您的枚举也不是int。它代表了它自己的概念,因此,将int指定给枚举不是正确的使用方法。对于我来说,上面的示例编译了为什么它在vs 2012和2015中编译得很好?出于兼容性原因,编译器错误尚未修复。它会破坏以前工作的代码。我刚刚了解到有一个错误的C编译器版本,它允许
ee=new DateTime()
!但这是固定的: