简体   繁体   中英

HasFlag always returns True

There is a way to check if I got a flag in a series of flag?

Example:

[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)

But a.Test.HasFlag always returns true, even without the TestEnum.ALIVE

You can certainly use Enum.HasFlag like everyone has suggested. However, its important to make sure that your enumeration falls in powers of two. Powers of two have a single bit set, so your enumeration should look like this:

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

The reason this is important is because you are comparing the bit flags. In memory, your enum flags will look like this:

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

When you do a bitwise compare, like DEAD | ALMOSTDEAD DEAD | ALMOSTDEAD , you are doing this:

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

Since the Result is > then 0, its true.

If you want to use this as FLAGS I believe your declaration is wrong. Check out this previous post. Because of the default incrementing, HasFlag won't work as you expect unless you set the values to powers of 2.

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

I think you are making a game, so you should make a class for this issue

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

Later you could check your states like this:

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

You can do bitwise operation like this:

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM