根据我的代码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]
的含义是什么?
答案 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.Parse
和Enum.ToString
方法的行为,以支持值的组合以及单个值,例如"a, b, c"
。