首页 > 解决方案 > 标记枚举奇怪的值

问题描述

[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 并运行代码段。

我是否设置了我的枚举错误或我查询的值错误?

我通常不使用标志我只是认为这将是一个很好的使用它们。

标签: c#enumsflags

解决方案


查看您如何定义枚举:

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

推荐阅读