C#枚举复用成员作为底层值时输出结果差异的原因咨询
C#枚举相同值时ToString()输出不同的原因
先明确C#枚举的核心行为:
- 多个枚举成员可以共用同一个底层数值,这是合法语法。
- 如果你直接通过枚举成员名赋值(比如
var myTest1 = test.east),ToString()默认返回该成员的名称,哪怕它和其他成员值完全一致。 - 如果你通过数值转换得到枚举实例(比如
var myTest1 = (test)0),ToString()会返回枚举定义中第一个出现的、值匹配的成员名称。
你碰到的输出差异,主要是以下两种情况之一:
1. 枚举实例的获取方式不一样
- 第一个示例里,你可能不是直接赋值
test.east,而是通过数值转换生成的实例(比如(test)0)。如果你的枚举定义是east=0, west=east,理论上第一个值为0的成员是east,应该返回east——但如果你的定义顺序写反了(比如west=0, east=west),第一个值为0的成员是west,此时数值转换得到的实例ToString()就会返回west,哪怕你以为自己赋值的是east。 - 第二个示例里,你确实是直接用
test.east赋值,所以ToString()返回east。
2. 运行时版本差异
在非常旧的.NET Framework版本(比如2.0)中,Enum.ToString()的行为和现代.NET(Core/.NET 5+)不同:当多个成员共用同一个值时,不管你怎么赋值,都会返回最后一个定义的成员名称。
- 第一个示例中
west定义在east之后,所以返回west; - 第二个示例中如果
south定义在east之前,就会返回east。
另外也不排除代码笔误的可能:第一个示例里你不小心把myTest1赋值成了test.west,却误以为是test.east,导致输出结果和预期不符。
内容的提问来源于stack exchange,提问作者SnowZ
相关产品推荐
相关产品推荐

