作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
[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。正确
,但它仍然返回 true 并运行代码段。
我的枚举设置有误还是我查询的值有误?
我通常不使用标志,我只是觉得它们会很好用。
最佳答案
查看您如何定义枚举:
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
关于c# - 标记枚举奇怪的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54840494/
我是一名优秀的程序员,十分优秀!