C# 为什么我可以为枚举值指定0.0,而不是1.0
出于好奇:为什么我可以将0.0赋值给枚举类型的变量,而不是1.0?请查看以下代码:C# 为什么我可以为枚举值指定0.0,而不是1.0,c#,C#,出于好奇:为什么我可以将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
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
}
}
我认为数字类型和枚举值之间的转换只允许通过强制转换?也就是说,我可以编写Foo
value2=(Foo)1.0代码>以便Main
中的第2行可以编译。为什么C#中的值0.0
会出现异常 C#中的枚举定义为整数值。为了保持一致性,C不应该接受这两个赋值,但是0.0
被静默地视为整数0
。这可能是C语言的遗留问题,在C语言中,文字0
经过特殊处理,基本上可以采用任何给定的类型–整数、浮点数、空指针…你可以说出来。C语言中的枚举定义为整数值。为了保持一致性,C不应该接受这两个赋值,但是0.0
被静默地视为整数0
。这可能是C语言的遗留问题,其中文字0
经过特殊处理,基本上可以采用任何给定类型–整数、浮点数、空指针…你可以说出来。这是一个可以使用0.0的错误。编译器隐式地将值为0的所有常量表达式视为0
现在,根据C#5规范第6.1.3节,编译器允许将常量int
表达式0隐式转换为枚举是正确的:
隐式枚举转换允许将十进制整数文字0转换为任何枚举类型以及任何基础类型为枚举类型的可为空类型。在后一种情况下,通过转换为基础枚举类型并包装结果来评估转换(§4.1.10)
我以前曾与C#团队讨论过这一点:他们本想删除从0.0(实际上是0.0m和0.0f)到枚举值的意外转换,但不幸的是,我认为它破坏了太多的代码——尽管从一开始就不应该被允许
Monomcs
编译器禁止所有这些浮点转换,尽管它允许:
尽管Zero
是一个常量表达式,但不是十进制整数文本
如果将来看到C#规范改变,允许任何值为0的整型常量表达式(即模仿mcs),我不会感到惊讶,但我不希望浮点转换正式正确。(我以前预测C#的未来是错误的,当然……这是一个可以使用0.0的错误。编译器隐式地将值为0的所有常量表达式视为0
现在,根据C#5规范第6.1.3节,编译器允许将常量int
表达式0隐式转换为枚举是正确的:
隐式枚举转换允许将十进制整数文字0转换为任何枚举类型以及任何基础类型为枚举类型的可为空类型。在后一种情况下,通过转换为基础枚举类型并包装结果来评估转换(§4.1.10)
我以前曾与C#团队讨论过这一点:他们本想删除从0.0(实际上是0.0m和0.0f)到枚举值的意外转换,但不幸的是,我认为它破坏了太多的代码——尽管从一开始就不应该被允许
Monomcs
编译器禁止所有这些浮点转换,尽管它允许:
尽管Zero
是一个常量表达式,但不是十进制整数文本
如果将来看到C#规范改变,允许任何值为0的整型常量表达式(即模仿mcs),我不会感到惊讶,但我不希望浮点转换正式正确。(关于预测C#的未来,我以前是错的,当然……)enum(在所有支持它的语言中)实际上是一种处理有意义且唯一的字符串(标签)而不是数值的方法。因此,在您的示例中,在处理Foo枚举数据类型时,只应使用Bar和Baz。您永远不应该使用(比较或赋值)整数,即使许多编译器会允许您使用它(枚举在内部通常是整数),在这种情况下,编译器会不经意地将0.0视为0
从概念上讲,在枚举值上加一个整数n,再往下取n个值,或者取val2-val1来查看它们之间的距离应该是可以的,但是除非语言规范明确允许,否则我会避免这样做。(按照您可以使用的方式,将枚举值视为类似于C指针。)没有理由不使用浮点数以及浮点数之间的固定增量来实现枚举,但我从未听说有任何语言可以做到这一点。枚举确实是有意的(在所有支持它的语言中)是一种处理有意义且唯一的字符串(标签)而不是数字值的方法。因此,在您的示例中,在处理Foo枚举数据类型时,只应使用Bar和Baz。您永远不应该使用(比较或赋值)整数,即使许多编译器会允许您使用它(枚举在内部通常是整数),在这种情况下,编译器会不经意地将0.0视为0
从概念上讲,可以将整数n添加到枚举值中,或者进一步获取n个值,或者取val2-val1以查看它们之间的距离,但除非语言规范明确规定
const int Zero = 0;
...
SomeEnum x = Zero;
enum E { A = 1 }
enum F { B = E.A } // ???