这样做没有数据丢失,那么必须明确将枚举转换为整数的原因是什么?
如果它是隐含的,比如当你有更高级别的方法时,它会不会更直观:
PerformOperation ( OperationType.Silent type )
其中PerformOperation
调用一个被公开的包装C ++方法:
_unmanaged_perform_operation ( int operation_type )
答案 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 ++)的语言中,我们的Colors
和Textures
都可以视为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.STANDING
和monsterObject.animator.State = Monster.DROOLING
,隐含地就调用类而言。
另外,是的,我有必要将枚举值视为数字。