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
的有效值,为什么不编译?
答案 0 :(得分:7)
问题不在于编译器能够或不能使该程序正常工作。问题是:语言规范 demand 要做什么?
此行为是规范的偏差,因此它是编译器错误。
6.1.3隐式枚举转换 隐式枚举转换允许将 decimal-integer-literal 0转换为任何枚举类型,并转换为其基础类型为枚举类型的任何可空类型。
所以它必须是文字。 1-1
不是字面零。 0
字面上为零。
我想知道为什么规范说"十进制"。这意味着hexadecimal-integer-literal
未包含在内,因此0x0
也不应该有效。