c# - 标记枚举奇怪的值
问题描述
[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 并运行代码段。
我是否设置了我的枚举错误或我查询的值错误?
我通常不使用标志我只是认为这将是一个很好的使用它们。
解决方案
查看您如何定义枚举:
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 - c语言循环中的连续数
- javascript - 如何从此 JavaScript 代码中删除此 DIV?
- javascript - RegExp 在 MongoDB 中查找多个字段的匹配文档
- javascript - 如何使用 javascript 访问 json 文件 (API) 中的元素?
- android - 小ImageView中的Android图标不清晰
- javascript - Typescript 中的继承有什么问题?
- python-3.x - ImportError:DLL加载失败:在VScode中找不到指定的模块
- python - Pyqtgraph plotwidget:无法将轴刻度的字体粗细更改为 BOLD
- matlab - Matlab颜色条pcolor
- path - 如果未完全指定路径,文件将保存在哪里?