标记枚举奇怪的值

Flags enum strange values

[Flags]
public enum Direction
{
    None = 0x0000,
    Left = 0x0001,
    Right = 0x0002,
    Up = 0x0004,
    Down = 0x0008,
    Forward = 0x0016,
    Backward = 0x0032
}

真的很困惑,我在 if 语句中使用这个枚举,如下所示:

if ((enumValues & Direction.Forward) == Direction.Forward)
{
    // do stuff
}

检查集合中是否包含标志。

if ((enumValues & Direction.Right) == Direction.Forward)
{
    // do stuff
}

保留 运行 这个 if ( Direction.Right ) 代码,尽管集合中不包含 Right 标志,我什至用中断调试它并且值不包含 Direction.Right 但它是仍然返回 true 和 运行 代码段。

我的枚举设置有误还是我查询的值有误?

我通常不使用标志,我只是觉得它们会很好用。

对于十六进制,您应该这样定义值:

Forward = 0x0010,
Backward = 0x0020

或十进制:

Forward = 16,
Backward = 32

看看你是如何定义你的枚举的:

None = 0x0000,
Left = 0x0001,
Right = 0x0002,
Up = 0x0004,
Down = 0x0008,
Forward = 0x0016,
Backward = 0x0032

您混淆了十六进制数和十进制数。

[Flags] 枚举中,枚举值的二进制表示应如下所示:

0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 1000

在十进制中,是 2 的幂:1、2、4、8、16 等

但是您编写值的方式以 0x 开头,表示十六进制值。因此,您实际上是将枚举大小写的值设置为 十六进制数 1、2、4、8 和 16。

你应该删除那些 0x:

None = 0,
Left = 1,
Right = 2,
Up = 4,
Down = 8,
Forward = 16,
Backward = 32