Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我可以为枚举值指定0.0,而不是1.0_C# - Fatal编程技术网

C# 为什么我可以为枚举值指定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

出于好奇:为什么我可以将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
    }
}

我认为数字类型和枚举值之间的转换只允许通过强制转换?也就是说,我可以编写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)到枚举值的意外转换,但不幸的是,我认为它破坏了太多的代码——尽管从一开始就不应该被允许

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

尽管
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)到枚举值的意外转换,但不幸的是,我认为它破坏了太多的代码——尽管从一开始就不应该被允许

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

尽管
Zero
是一个常量表达式,但不是十进制整数文本

如果将来看到C#规范改变,允许任何值为0的整型常量表达式(即模仿mcs),我不会感到惊讶,但我不希望浮点转换正式正确。(关于预测C#的未来,我以前是错的,当然……)

enum(在所有支持它的语言中)实际上是一种处理有意义且唯一的字符串(标签)而不是数值的方法。因此,在您的示例中,在处理Foo枚举数据类型时,只应使用BarBaz。您永远不应该使用(比较或赋值)整数,即使许多编译器会允许您使用它(枚举在内部通常是整数),在这种情况下,编译器会不经意地将0.0视为0

从概念上讲,在枚举值上加一个整数n,再往下取n个值,或者取val2-val1来查看它们之间的距离应该是可以的,但是除非语言规范明确允许,否则我会避免这样做。(按照您可以使用的方式,将枚举值视为类似于C指针。)没有理由不使用浮点数以及浮点数之间的固定增量来实现枚举,但我从未听说有任何语言可以做到这一点。

枚举确实是有意的(在所有支持它的语言中)是一种处理有意义且唯一的字符串(标签)而不是数字值的方法。因此,在您的示例中,在处理Foo枚举数据类型时,只应使用BarBaz。您永远不应该使用(比较或赋值)整数,即使许多编译器会允许您使用它(枚举在内部通常是整数),在这种情况下,编译器会不经意地将0.0视为0

从概念上讲,可以将整数n添加到枚举值中,或者进一步获取n个值,或者取val2-val1以查看它们之间的距离,但除非语言规范明确规定
const int Zero = 0;
...

SomeEnum x = Zero;
enum E { A = 1 }
enum F { B = E.A }  // ???