我今天偶然发现了这个奇怪的事情:
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,为什么不编译呢?
问题不在于编译器能够或不能使该程序工作.问题是:语言规范需要做什么?
此行为是规范的偏差,因此它是编译器错误.
6.1.3隐式枚举转换隐式枚举转换允许将decimal-integer-literal 0转换为任何枚举类型,并转换为其基础类型为枚举类型的任何可空类型.
所以它必须是文字.1-1不是字面上的零.0字面上为零.
我想知道为什么规范说"十进制".这意味着hexadecimal-integer-literal不包括在内0x0也不应该工作.
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |