当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-11 01:29:57 C#

为什么一个枚举需要显式转换为int类型?这样做不会丢失数据,那么为什么必须将枚举显式转换为整数呢?如果它是隐式的,不是更直观吗,就像当你有更高级别的方法时:enumMedals{Gold,Silver,Bronze}[Flags]enumFilePermissionFlags{CanRead=0x01,CanWrite=0x02,CanDelete=0x04}在第一种情况下,将这些东西视为数字没有意义。它们存储为整数这一事实是一个实现细节。您不能在逻辑上加、减、乘或除金、银和铜。在第二种情况下,将这些东西视为数字也没有意义。您不能对它们进行加、减、乘或除。唯一合理的操作是按位操作。枚举是错误的数字,所以你不应该不小心把它们当作数字。因为枚举不一定是基于int的:enum关键字用于声明枚举,这是一种独特的类型,由称为枚举器列表的命名常量组成。每个枚举类型都有一个底层类型,它可以是除char之外的任何整数类型。所以你可以这样做:enumSomething:long{valueX=0,valueY=2147483648L}为什么说没有数据丢失?毕竟,并非所有枚举都是单一的。它们必须是整数类型,但这可能意味着字节、ulong等。然而,作为一个角落,文字0是隐含的;那你的用例是什么?我很少需要这样做——通常是数据导入等。偶尔的空操作对我来说非常有意义,可以避免意外错误。如果它是隐式的,它会不会更直观,就像当你有更高级别的方法时:我实际上不这么认为。在这种情况下,您尝试在边缘情况下使用枚举。但是,如果将枚举隐式转换为整数值,则会大大降低其有效性。通过将显式转换转换为int,编译器将枚举视为一种特殊类型-许多选项之一,而不是整数。这更清楚地展示了枚举的意图,并减少了程序员错误的可能性(即:将枚举中未定义的值分配给枚举变量等)。我个人很高兴C#中的枚举不仅仅是(有效地)常量int值。这就是C#的工作方式……如果从int继承Enuminheritance,那么这应该是可能的。枚举不继承继承,因此需要强制转换。类被隐式转换的唯一方法是它们是否继承。我认为“为什么枚举需要显式转换为int类型?”的答案根据C#,强类型枚举可有效防御常见的编程错误。假设我有一个基于两个枚举的绘画管理应用程序:enumTextures{Gloss,Satin,Matt};枚举颜色{白色、绿色、红色、蓝色、棕色};和这样的房间绘画方法:privatevoidPaintRoom(Texturestexture,Colorscolor)在像C#这样具有强枚举类型的语言中,这个命令:纹理.马特);...将生成编译时错误(无法将颜色放入预期的纹理位置,反之亦然)。但是在枚举不是强类型和/或隐式转换的语言中(包括C和C++),我们的Colors和Textures都可以被视为int,因此我们可以愉快地发出PaintRoom(Colors.White,Textures.Matt)命令它编译得很好,但我们最终得到了一个漆成有光泽的红色(0,2)而不是我们想要的马特白色(2,0)的房间,快速查看代码似乎就是这样说的。因此,强硬的枚举通常是一件好事,可以防止人们不小心将枚举放在不合适的地方。如果有人真的希望他们的枚举是一个int,C#会强制编码人员通过坚持显式转换来明确他们的意图。正如其他人所说,不可能将所需的EnumType转换从EnumType更改为int。但是,有几种解决方法。例如,我有几个引用类似这样的枚举,并希望能够将它们中的任何一个分配给变量。所以我去:publicValueTypeState{get{returnstate;}设置{state=(int)value;所以,我可以说playerObject.animator.State=Player.STANDING和monsterObject.animator.State=Monster.DROOLING,就调用类而言是隐含的。另外,是的,我必须将枚举值视为数字是有正当理由的。以上是C#学习教程:为什么枚举需要显式转换为int类型?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: