HasFlag 始终返回 True

本文关键字:True 返回 HasFlag | 更新日期: 2023-09-27 18:35:56

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

例:

[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

HasFlag 始终返回 True

你当然可以像大家建议的那样使用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 | ALMOSTDEAD ,您正在执行以下操作:

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

由于结果是> 然后是 0,因此它为 true。

如果你想把它用作标志,我相信你的声明是错误的。看看这篇上一篇文章。由于默认递增,除非将值设置为 2 的幂,否则 HasFlag 将无法按预期工作。

[标志] 枚举属性在 C# 中是什么意思?

我认为你正在制作一个游戏,所以你应该为这个问题做一个类

public class Player
{
    bool isAlive;
    bool isHurt;
...
}

稍后您可以像这样检查您的状态:

if (player.isAlive && player.isHurt)
{
 //dosomething
}

您可以像这样进行按位运算:

var alive = TestEnum.Alive;
var hurt = TestEnum.Hurt;
var aliveAndHurt = alive & hurt;

您可以使用 Enum.HasFlag 来检查这一点。

bool aTest2 = aTest.HasFlag(TestEnum.ALIVE);