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

时间:2011-01-18 19:43:41

标签: c# .net enums casting

这样做没有数据丢失,那么必须明确将枚举转换为整数的原因是什么?

如果它是隐含的,比如当你有更高级别的方法时,它会不会更直观:

PerformOperation ( OperationType.Silent type )

其中PerformOperation调用一个被公开的包装C ++方法:

_unmanaged_perform_operation ( int operation_type )

7 个答案:

答案 0 :(得分:43)

枚举有两种主要和不一致的用法:

enum Medals
{ Gold, Silver, Bronze }

[Flags]
enum FilePermissionFlags
{
    CanRead = 0x01,
    CanWrite = 0x02,
    CanDelete = 0x04
}

在第一种情况下,将这些东西视为数字是没有意义的。它们作为整数存储的事实是一个实现细节。您无法在逻辑上添加,减去,乘以或除以金,银和铜。

在第二种情况下,将这些东西视为数字是没有意义的。您不能对它们进行加,减,乘或除。唯一合理的操作是按位操作。

枚举很糟糕,所以你不应该把它们当作数字处理。

答案 1 :(得分:5)

因为枚举不必基于int

  

enum关键字用于声明   枚举,一种独特的类型   由一组命名常量组成   称为枚举器列表。一切   枚举类型有底层   类型,可以是任何整数类型   除了char。

所以你可以这样做:

enum Something :long  { valueX = 0, valueY = 2147483648L }

答案 2 :(得分:2)

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

作为一个角落,文字0 隐含的,但是;那你的用例是什么?

我很少需要这样做 - 通常是数据导入等。偶尔的无操作演员对我来说非常有意义,并避免意外错误。

答案 3 :(得分:2)

  

如果它是隐含的,比如当你有更高级别的方法时,它会不会更直观:

我其实不这么认为。在这种情况下,您尝试在边缘情况下使用枚举。

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

我个人很高兴C#中的枚举超过(有效)一个常量的int值。

答案 4 :(得分:1)

这就是C#的工作方式......

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

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

答案 5 :(得分:1)

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

想象一下,我有一个基于两个枚举的绘画管理应用程序:

enum Textures { Gloss, Satin, Matt };
enum Colors { White, Green, Red, Blue, Brown };

这样的房间绘画方法:

private void PaintRoom (Textures texture, Colors color)

在C#中具有强枚举类型的语言中,有如下命令:

 // nonsensical attempt to have texture=White and color=Matt
PaintRoom(Colors.White, Textures.Matt);

...会产生编译时错误(不能将颜色放到预期纹理的位置,反之亦然)。但是在枚举不是强类型和/或隐式转换(包括C和C ++)的语言中,我们的ColorsTextures都可以视为int,所以我们可以愉快地发出一个PaintRoom(Colors.White, Textures.Matt)命令,它会编译得很好,但我们最终会得到一个房间漆成光泽红(0,2)而不是我们想要的Matt White(2,0)和代码快速的目光似乎在说。

如此强烈的类型枚举大多是一件好事,可以阻止人们不小心将枚举放入他们不适合的地方。如果某人真的希望他们的枚举为int,C#会强制编码人员通过坚持明确转换来明确其意图。

答案 6 :(得分:0)

正如其他人所说,无法将所需的演员阵容从EnumType更改为int。但是,有几种解决方法。例如,我有几个枚举引用类似的东西,并希望能够将它们中的任何一个分配给变量。所以我选择了:

public ValueType State {
    get {
        return state;
    }
    set {
        state = (int)value;
    }
}

因此,我可以说playerObject.animator.State = Player.STANDINGmonsterObject.animator.State = Monster.DROOLING,隐含地就调用类而言。

另外,是的,我有必要将枚举值视为数字。