我有一个枚举(旗帜)
[Flags]
public enum DisplayMode
{
None,
Dim,
Inverted,
Parse,
Italics,
Bold
}
我想将两个标志分配给变量,如下所示:
var displayFlags = DisplayMode.Parse | DisplayMode.Inverted;
但是,当我在分配后立即调试并将鼠标悬停在此变量上时,它表示displayFlags
为DisplayMode.Dim | DisplayMode.Inverted
。
我缺少什么/不理解?
答案 0 :(得分:9)
你错过了分配标志敏感值,例如:
[Flags]
public enum DisplayMode
{
None = 0,
Dim = 1,
Inverted = 2,
Parse = 4,
Italics = 8,
Bold = 16
}
这样每个值在数字表示中都有一个单独的位。
如果你不相信你能够加倍值,你可以使用位移:
[Flags]
public enum DisplayMode
{
None = 0,
Dim = 1 << 0,
Inverted = 1 << 1,
Parse = 1 << 2,
Italics = 1 << 3,
Bold = 1 << 4
}
来自FlagsAttribute
的文档:
FlagsAttribute和Enum指南
仅当对数值执行按位运算(AND,OR,EXCLUSIVE OR)时,才使用FlagsAttribute自定义属性进行枚举。
定义2的幂的枚举常量,即1,2,4,8等。这意味着组合枚举常量中的各个标志不会重叠。
...
答案 1 :(得分:4)
默认情况下,枚举会为成员分配连续值。所以你基本上得到了:
[Flags]
public enum DisplayMode
{
None = 0,
Dim = 1,
Inverted = 2,
Parse = 3,
Italics = 4,
Bold = 5
}
这对二进制/标志不起作用。所以你需要明确:
[Flags]
public enum DisplayMode
{
None = 0,
Dim = 1,
Inverted = 2,
Parse = 4,
Italics = 8,
Bold = 16
}
答案 2 :(得分:1)
声明后,您没有为枚举提供适当的值:
[Flags]
public enum DisplayMode
{
None = 0,
Dim = 1,
Inverted = 2,
Parse = 4,
Italics = 8,
Bold = 16
}
答案 3 :(得分:0)
您需要明确指定标志的值。如声明,Parse是3,这是Dim |反转。
尝试
[Flags]
public enum DisplayMode
{
None = 0,
Dim = 1 << 0,
Inverted = 1 << 1,
Parse = 1 << 2,
Italics = 1 << 3,
Bold = 1 << 4
}
答案 4 :(得分:0)
您需要将枚举值定义为2的幂:
[Flags]
public enum DisplayMode
{
None = 1,
Dim = 2,
Inverted = 4,
Parse = 8,
Italics = 16,
Bold = 32
}
此处提供更多信息:http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx
答案 5 :(得分:0)
由于您正在使用标记,因此您需要以二进制术语进行思考,因此每次应将您的值增加2。例如,想一想:
0001 = 0x01,
0010 = 0x02,
0100 = 0x04,
1000 = 0x08
依旧......