[Flags]
public enum Direction
{
None = 0x0000,
Left = 0x0001,
Right = 0x0002,
Up = 0x0004,
Down = 0x0008,
Forward = 0x0016,
Backward = 0x0032
}
Run Code Online (Sandbox Code Playgroud)
真的很困惑,我在if语句中使用这个枚举是这样的:
if ((enumValues & Direction.Forward) == Direction.Forward)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
检查它是否包含集合中的标志.
if ((enumValues & Direction.Right) == Direction.Forward)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
if ( Direction.Right )尽管在集合中没有包含Right标志,但仍然运行此代码,我甚至使用中断调试它并且值不包含Direction.Right但它仍然返回true并运行代码段.
我是否设置了枚举错误或者我是否错误地查询了值?
我通常不使用旗帜我只是认为它会很好地利用它们.
看看你如何定义你的枚举:
None = 0x0000,
Left = 0x0001,
Right = 0x0002,
Up = 0x0004,
Down = 0x0008,
Forward = 0x0016,
Backward = 0x0032
Run Code Online (Sandbox Code Playgroud)
您混淆十六进制和十进制数字.
在[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
Run Code Online (Sandbox Code Playgroud)
以十进制表示的是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
Run Code Online (Sandbox Code Playgroud)