c# - HasFlag 始终返回 True

标签 c# enums

有一种方法可以检查我是否在一系列标志中得到了一个标志?

例子:

[Flags]
Enum TestEnum
{
  ALIVE, DEAD, ALMOSTDEAD, HURT, OTHERS

}
// check if is alive and has been hurt
TestEnum aTest = TestEnum.ALIVE | TestEnum.HURT
bool aTest2 = aTest.HasFlag(TestEnum.ALIVE)

但是 a.Test.HasFlag 总是返回 true,即使没有 TestEnum.ALIVE

最佳答案

你当然可以使用 Enum.HasFlag就像每个人都建议的那样。但是,重要的是要确保您的枚举符合 2 的幂。 2 的幂只设置了一个位,因此您的枚举应如下所示:

Enum TestEnum
{
    ALIVE = 1, DEAD = 2, ALMOSTDEAD = 4, HURT = 8, OTHERS = 16
}

这很重要的原因是因为您正在比较位标志。在内存中,您的枚举标志将如下所示:

ALIVE      = 00001
DEAD       = 00010
ALMOSTDEAD = 00100
HURT       = 01000
OTHERS     = 10000

当你进行按位比较时,比如 DEAD |差点死了,你正在这样做:

DEAD       = 00010
           OR
ALMOSTDEAD = 00100
------------------
RESULT     = 00110

因为结果 > 然后是 0,所以它是真的。

关于c# - HasFlag 始终返回 True,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19458478/

相关文章:

c# - 无法在Unity 5中执行extern c函数

enums - 是否可以在对枚举的可变引用的值中切换变体?

GCC:是否可以在使用 -pedantic 时禁用 "comma at end of enumerator list"警告?

c# - 如何使 JSON.NET StringEnumConverter 使用连字符分隔的大小写

ios - 现在如何在 RealmSwift 4.0 更新中使用枚举?

c# - 无法从 WPF 扩展工具包为 AutoCompleteTextBox 设置 "Item Source"

c# - Service Fabric 容器 - 无法访问集群内的服务

c# - NPOI 将范围复制到另一个工作表

c# - ItemTemplate 中的控件无法在代码隐藏中调用

c++ - 在类中声明一个枚举