HasFlag始终返回True

时间:2013-10-18 20:26:11

标签: 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

5 个答案:

答案 0 :(得分:6)

你当然可以像所有人建议的那样使用Enum.HasFlag。但是,确保您的枚举属于两个权限非常重要。两个函数的权限设置为单个,因此您的枚举应如下所示:

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,它是真的。

答案 1 :(得分:1)

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

What does the [Flags] Enum Attribute mean in C#?

答案 2 :(得分:0)

我认为你正在制作游戏,所以你应该为这个问题上课

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

稍后你可以查看你的状态:

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

答案 3 :(得分:0)

您可以像这样执行按位操作:

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

答案 4 :(得分:-1)

您可以使用Enum.HasFlag来检查此内容。

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