c# – 为什么我可以将枚举值赋值为0.0,而不是1.0

只是出于好奇:为什么我可以分配0.0到一个枚举类型的变量,但不是1.0?看看下面的代码:

public enum Foo
{
    Bar,
    Baz
}

class Program
{
    static void Main()
    {
        Foo value1 = 0.0;
        Foo value2 = 1.0;   // This line does not compile
        Foo value3 = 4.2;   // This line does not compile
    }
}

我认为数值类型和枚举值之间的转换只允许通过casts?这就是我可以写Foo value2 =(Foo)1.0;使得Main中的第2行可以编译。为什么C#中的值0.0有异常?

这是一个可以使用0.0的错误。编译器隐式地将值为零的所有常量表达式视为0。

现在,根据C#5规范的第6.1.3节,编译器允许从0的常量int表达式到您的枚举的隐式转换是正确的:

An implicit enumeration conversion permits the decimal-integer-literal 0 to be converted to any enum-type and to any nullable-type whose underlying type is an enum-type. In the latter case the conversion is evaluated by converting to the underlying enum-type and wrapping the result (§4.1.10).

我之前与C#团队谈过这个问题:他们希望从0.0(确实是0.0m和0.0f)到枚举值的意外转换,但不幸的是,我收集它破坏了太多的代码 – 即使它应该从来没有被允许在第一。

Mono mcs编译器禁止所有这些浮点数转换,尽管它允许:

const int Zero = 0;
...

SomeEnum x = Zero;

尽管事实上Zero是一个常量表达式,但不是一个十进制整数文字。

我不会惊讶地看到C#规范在未来允许任何整数常量表达式的值为0(即模仿mcs),但我不会指望浮点转换永远正式正确。 (我以前错了预测未来的C#,当然…)

http://stackoverflow.com/questions/23762475/why-can-i-assign-0-0-to-enumeration-values-but-not-1-0

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 为什么我可以将枚举值赋值为0.0,而不是1.0