C# 为什么不应该';这不是编译吗?
今天我偶然发现了一件奇怪的事情: 问题5 守则: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); } } 现在
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()
!但这是固定的: