我有一个枚举(标志)
[Flags]
public enum DisplayMode
{
None,
Dim,
Inverted,
Parse,
Italics,
Bold
}
我想将两个标志分配给一个变量,如下所示:
var displayFlags = DisplayMode.Parse | DisplayMode.Inverted;
但是,当我在分配变量后立即调试并悬停在该变量上时,它说
displayFlags
是DisplayMode.Dim | DisplayMode.Inverted
。我缺少/不了解什么?
最佳答案
您错过了为标志分配合理值的方法,例如:
[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等。这意味着组合枚举常量中的各个标志不会重叠。
...