标志枚举奇怪的值

时间:2019-02-23 10:10:30

标签: c# enums flags

[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
}

尽管未在集合中包含Right标志,但仍继续运行此if ( Direction.Right )代码,我什至用中断对其进行了调试,并且该值不包含Direction.Right,但仍返回true并运行片段。

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

我通常不使用标志,我只是认为这是对它们的一种很好的用途。

2 个答案:

答案 0 :(得分:5)

了解您如何定义枚举:

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

答案 1 :(得分:1)

对于十六进制,您应定义以下值:

Forward = 0x0010,
Backward = 0x0020

或十进制:

Forward = 16,
Backward = 32
相关问题