C# 枚举,之前的枚举值是 double 类型

3
我发现了一些看起来很奇怪但同时又有些道理的东西,原因我不清楚。
我有这个枚举:
[Flags] public enum Flags { RemoveQuoteMarks = 1, t1 = 2, t2 = 4, t3 = 8, t4 = 16, t5 = 32, t6 = 64, t7 = 128 }

之前,我没有手动设置枚举值,它们的索引从0开始,并按1递增,对吗?

但是当我尝试加载这个字符串时,我注意到了奇怪的行为:

string value = "t1, t3, t4, t7";

并使用以下方式解析:

Flags flags = (Flags)Enum.Parse(typeof(Flags), value);

结果只是 't7',所以我进行了一些研究,并注意到许多其他人使用手动索引,其中每个枚举值都会被其前一个加倍(例如 't3 = 8','t4 = 16'),所以我将此规则应用于我的代码中,它奏效了,我的解析的枚举现在显示为:

t1, t3, t4, t7

按照您的要求,为什么我必须手动配置枚举值?

因为它使用了位运算符|。如果你不修改这样的值,它将会像1 | 3 | 4 | 7一样,结果为7。因为7在二进制中表示为111,会吞噬掉其他所有的值 ;) - M.kazem Akhgary
阅读重复问题的答案,尤其是“内部实现”部分。 - Blorgbeard
谢谢大家,我感觉现在理解得更好了! - Dean Reynolds
1个回答

1
你需要这个的原因是,标志枚举被表示为二进制数。每个值都是2的幂次方(1、2、4、8、16等)对应于二进制数中的不同索引:
  • 2 -> 10
  • 4 -> 100
  • 8 -> 1000
这是必要的,以便确定给定值实际包含哪些标志。例如,如果您的类具有枚举值1110,则它具有2、4和8的标志值。
如果使用不是2的幂次方的值,则c#无法合理地区分通过位运算符&表示的哪些枚举值是由您的类的标志表示的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接