【问题标题】:C# enum, double previous enum value [duplicate]C#枚举,双前枚举值[重复]
【发布时间】:2016-03-05 21:54:59
【问题描述】:

我遇到了一些对我来说似乎很奇怪的事情,但同时出于我不知道的原因有些道理。

我有这个枚举:

[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 并且会吃掉所有其他值;)
  • 阅读副本的答案,尤其是“幕后”部分。
  • 谢谢大家,我感觉我现在明白了很多!

标签: c# enums


【解决方案1】:

您需要它的原因是标志枚举表示为二进制数。每个值为 2 的幂(1、2、4、8、16 等)的值对应于二进制数中的不同索引:

  • 2 -> 10
  • 4 -> 100
  • 8 -> 1000

这是必不可少的,这样您就可以确定给定值实际包含哪些标志。例如,如果您的类的枚举值为 1110,则它的标志值为 2,4 和 8。

如果您使用不是 2 的幂的值,c# 在执行按位和& 时,将无法再合理地区分哪些枚举值由您的类标志表示。

【讨论】:

    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多