C# 枚举,双前枚举值

标签 c# enums

<分区>

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

我有这个枚举:

[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

根据需要,为什么我必须像那样手动配置我的枚举值?

最佳答案

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

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

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

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

关于C# 枚举,双前枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34029508/

相关文章:

c# - 发布有效数据后从 C# 下载文件

java - Java中关于集合、枚举和迭代器的困惑

快速字典 : map within a map

c# - 为什么 C# Ado.net 比 Entity Framework 6.1.3 慢?

java - c中枚举的int值是多少?

c# - 使用 EnumToList<T> 时如何将 <T> 转换为 Enum

java - 在运行时生成新的枚举值

c# - 如何正确地将集合数据绑定(bind)到TabControl?

javascript - 在 MongoDB 中插入错误的日期

c# - 我可以为多选组合框创建 SelectedItems 属性吗