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

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

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

PerformOperation ( OperationType.Silent type ) 

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

 _unmanaged_perform_operation ( int operation_type ) 

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

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

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

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

枚举是糟糕的数字,所以你不应该意外地将它们视为数字。

因为枚举不必是基于int的:

enum关键字用于声明枚举,这是一种由称为枚举器列表的命名常量组成的不同类型。 每个枚举类型都有一个底层类型,除了char之外,它可以是任何整数类型。

所以你可以这样做:

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

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

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

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

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

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

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

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

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

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

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

我认为“为什么枚举需要显式转换为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#强迫编码人员通过坚持明确的转换来明确他们的意图。

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

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

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

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