旗帜枚举奇怪的价值观

问题描述 投票:2回答:2
[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并运行代码片段。

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

我通常不使用旗帜我只是认为它会很好地利用它们。

c# enums flags
2个回答
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,1等的幂

但是你写这些值的方式是从0x开始,它表示一个十六进制值。因此,您实际上将枚举案例的值设置为十六进制数字1,2,4,8和16。

你应该删除那些0x

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

1
投票

对于hex,您应该定义如下值:

Forward = 0x0010,
Backward = 0x0020

或者在十进制中:

Forward = 16,
Backward = 32
© www.soinside.com 2019 - 2024. All rights reserved.