Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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# 为什么枚举需要显式转换为int类型?_C#_.net_Enums_Casting - Fatal编程技术网

C# 为什么枚举需要显式转换为int类型?

C# 为什么枚举需要显式转换为int类型?,c#,.net,enums,casting,C#,.net,Enums,Casting,这样做不会造成数据丢失,那么必须显式将枚举强制转换为int的原因是什么 如果它是隐式的,比如说当你有一个更高层次的方法,比如: PerformOperation ( OperationType.Silent type ) 其中 PrimeStudio调用一个被包装的C++方法,它被暴露出来: _unmanaged_perform_operation ( int operation_type ) 因为枚举不必基于int: enum关键字用于声明 枚举,一种独特的类型 由一组命名常量组成 调用枚

这样做不会造成数据丢失,那么必须显式将枚举强制转换为int的原因是什么

如果它是隐式的,比如说当你有一个更高层次的方法,比如:

PerformOperation ( OperationType.Silent type )

其中<代码> PrimeStudio调用一个被包装的C++方法,它被暴露出来:

_unmanaged_perform_operation ( int operation_type )

因为枚举不必基于
int

enum关键字用于声明 枚举,一种独特的类型 由一组命名常量组成 调用枚举器列表。每一个 枚举类型具有基础 类型,可以是任何整型 除了char

所以你可以这样做:

enum Something :long  { valueX = 0, valueY = 2147483648L }
private void PaintRoom (Textures texture, Colors color)
 // nonsensical attempt to have texture=White and color=Matt
PaintRoom(Colors.White, Textures.Matt);

你为什么说没有数据丢失?毕竟,并非所有枚举都是整数。它们必须是整数类型,但这可能意味着字节、ulong等

作为一种特殊情况,文字0是隐式的,但是;您在这里的用例是什么

我很少需要这样做——通常是数据导入等。偶尔进行不操作转换对我来说非常有意义,可以避免意外错误。

这就是C#的工作方式

如果Enum是从int继承的,那么这应该是可能的。枚举不从int继承,因此需要强制转换

隐式强制转换类的唯一方法是它们是否继承

如果它是隐式的,比如说当你有一个更高层次的方法,比如:

PerformOperation ( OperationType.Silent type )
其实我不这么认为。在本例中,您尝试在边缘案例中使用枚举

但是,如果枚举被隐式转换为整数值,这将大大降低它们的有效性。通过显式强制int转换,编译器将enum视为一种特殊类型—许多选项之一,而不是整数。这更清楚地说明了枚举的意图,并减少了程序员出错的机会(即:将枚举中未定义的值分配给枚举变量等)


我个人很高兴C#中的enum不仅仅(有效地)是一个常量int值。

enum有两种主要且不一致的用法:

enum Medals
{ Gold, Silver, Bronze }

[Flags]
enum FilePermissionFlags
{
    CanRead = 0x01,
    CanWrite = 0x02,
    CanDelete = 0x04
}
在第一种情况下,把这些东西当作数字是没有意义的。它们存储为整数这一事实是一个实现细节。你不能逻辑地加、减、乘或除金、银和铜

在第二种情况下,把这些东西当作数字也没有意义。你不能加、减、乘或除它们。唯一合理的操作是按位操作


枚举是糟糕的数字,因此您不应该意外地将它们视为数字。

正如其他人所说,不可能将所需的强制转换从
EnumType
更改为
int
。但是,有几个变通办法。例如,我有几个枚举引用类似的东西,并且希望能够将它们中的任何一个分配给变量。所以我选择了:

public ValueType State {
    get {
        return state;
    }
    set {
        state = (int)value;
    }
}
因此,我可以说
playerObject.animator.State=Player.STANDING
monsterObject.animator.State=Monster.DROOLING
,这是调用类所能理解的


此外,是的,我必须将枚举值视为数字有一个合理的原因。

我认为“为什么枚举需要显式转换为int类型?”的答案是,根据C#的强类型枚举是防止常见编程错误的一种有用的防御措施

假设我有一个基于两个枚举的绘画管理应用程序:

enum Textures { Gloss, Satin, Matt };
enum Colors { White, Green, Red, Blue, Brown };
还有一个房间的绘画方法,像这样:

enum Something :long  { valueX = 0, valueY = 2147483648L }
private void PaintRoom (Textures texture, Colors color)
 // nonsensical attempt to have texture=White and color=Matt
PaintRoom(Colors.White, Textures.Matt);
在像C#这样具有强枚举类型的语言中,命令如下:

enum Something :long  { valueX = 0, valueY = 2147483648L }
private void PaintRoom (Textures texture, Colors color)
 // nonsensical attempt to have texture=White and color=Matt
PaintRoom(Colors.White, Textures.Matt);
…将导致编译时错误(无法将颜色放入预期纹理的位置,反之亦然)。但是在枚举不是强类型和/或可能发生隐式转换的语言中(包括C和C++),我们的
颜色和
纹理都可以被视为
int
,因此我们可以愉快地发出
PaintRoom(Colors.White,Textures.Matt)
命令,它可以很好地编译,但最终我们的房间被漆成了亮红色(0,2),而不是我们想要的哑光白色(2,0),代码在快速浏览时似乎是这么说的


因此,强类型枚举通常是一件好事,可以防止人们意外地将枚举放入不适合的位置。如果有人真的希望自己的枚举为
int
,C#会强制编码者通过坚持显式转换来明确其意图。

你是对的,但编译器可以确定枚举是否基于int,并允许这样做,或者通过其他方式强制和基于int的枚举?或者,它可以尝试始终隐式转换为第一个成员的类型。当然编译器可以-但是
valueY-valueX
的含义是什么?如果名称为
蓝色
方格图案
?如果你经常使用枚举作为整数,那么显式转换是一个负担,也许你应该质疑你的设计。我只是想找到我现在得到的推理。但是我不认为我的设计有任何问题,因为就像我说的,包装框架超出了我的控制范围。谢谢,我不知道你在第二段中的意思。0可以隐式转换为枚举?@Joan:规范说,任何文本零都可以转换为任何枚举,因此,即使枚举中没有定义零值,也可以保证将其初始化为默认值。编译器实际上允许任何常数为零。请看和了解可怕的细节。@Eric:谢谢,我现在知道了。我也不清楚马克的第一段。所以不管成员是字符串还是任何其他类型,枚举都是基于int的?就像成员被存储为INTS一样?@ Join——考虑<代码> EnUM Fo: sByth{}.}/Case>这里的每个成员都是SyBub,而不是int。当显式指定枚举时,如何将EnUM隐式转换为其基础值类型。i、 e.“enum FilePermissionFlags:int”可以隐式转换为int。@Lazlo:An