旗帜枚举混乱C#

时间:2009-08-26 08:08:22

标签: c# enums attributes enum-flags

根据我的代码a = 1,b = 2,c = 3等我认为该标志会使a = 1,b = 2,c = 4等等

[Flags]
public enum someEnum { none, a, b, c, d, e, f, }

我如何得到我的意图(c = 4,e = 8)?以及[Flags]的含义是什么?

4 个答案:

答案 0 :(得分:17)

您可以指定枚举的值,这是标志案例所需的:

[Flags]
enum MyFlags {
  Alpha=1,
  Beta=2,
  Gamma=4,
  Delta=8
}
  

上面的[Flags]是什么意思?

这意味着运行时将支持对值的按位运算。它对编译器生成的值没有任何影响。例如。如果你这样做

var x = MyFlags.Alpha | MyFlags.Beta;

使用Flags属性,x.ToString()的结果为“Alpha, Beta”。没有属性,它将是3.也改变解析行为。

编辑:更新了更好的名称,编译器不会在非标志属性上使用按位操作,至少不是C#3或4(对我来说是新闻)。

答案 1 :(得分:1)

标志属性表示枚举可以被视为位字段;也就是说,一组标志。

答案 2 :(得分:1)

Flags属性实际上只影响枚举中ToString(),Parse()和IsDefined()方法的行为/输出。

只要使用两个值的幂,就可以在不使用Flags属性的情况下执行按位运算。

阅读this existing question(及答案)以获取更详细的报道。

答案 3 :(得分:0)

[Flags]不会改变编译器为每个标识符分配值的方式,无论枚举是否包含标记,您始终有责任确保每个值都合适。

它也不会改变编译器在枚举上允许的按位操作。

它所做的是改变Enum.ParseEnum.ToString方法的行为,以支持值的组合以及单个值,例如"a, b, c"