为什么枚举需要显式转换为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 ++)的语言中,我们的Colors
和Textures
都可以被视为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.STANDING
和monsterObject.animator.State = Monster.DROOLING
,隐含地就调用类而言。
此外,是的,有一个合理的原因,我必须将枚举值视为数字。
- “System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy”类型中的方法“ExecuteAsync”没有实现
- Log4Net可以自动删除日志文件吗?
- 如何在使用Active Directory角色和身份validation提供程序时提供ASP.NET窗体身份validationUX?
- 如何使用Win32调用在C#中关闭/打开控制台?
- 无法在生产ASP.net网站上加载文件或程序集Microsoft.SqlServer.SqlClrProvider,它在哪里?
- 为什么FxCop警告此C#代码中的溢出(CA2233)?
- 文件正在被复制吗?
- 为什么我的表单身份validation票证到期如此之快?
- entity framework – 一对一 – ReferentialConstraint映射到商店生成的列