枚举标志检查标志始终返回true

时间:2011-11-15 23:09:31

标签: c# enums bitwise-operators bitwise-and

我必须做一些非常愚蠢的事情,但我看不清楚是什么。在一个简单的控制台应用程序中,我有;

[Flags]
public enum ConsoleStates : byte
{
    TopLevel,
    All,
    MainMenu,
    SingleLeagueSelected,
}

然后

public class Program
{
    static void Main(string[] args)
    {
        Program p = new Program();
        p.StartUp(args);
    }

    private bool CheckFlag(ConsoleStates targetVal, ConsoleStates checkVal)
    {
        return ((targetVal & checkVal) == checkVal);
    }

    private void StartUp(string[] args)
    {
        int x = 0;
        ConsoleStates states = (ConsoleStates.All | ConsoleStates.MainMenu);
        if (CheckFlag(states, ConsoleStates.SingleLeagueSelected))
        {
            x++;
        }
     }
}

我的问题X最后应该为零,但它始终为1.据我所知,它应该做一些明智的操作,并检查是否有单一的候选,并返回false。

这很奇怪,我所有的谷歌搜索说这很简单,只是有效,但对于我的生活,我无法得到它。 /感到羞耻。

3 个答案:

答案 0 :(得分:5)

枚举默认值为0,1,2,3,...添加FlagsAttribute的AFAIK不会改变这一点。 我认为你需要明确设置你想要的值,例如:

[Flags]
public enum ConsoleStates : byte
{
    TopLevel = 0,
    All = 1,
    MainMenu = 2,
    SingleLeagueSelected = 4,
}

答案 1 :(得分:2)

您的枚举从0开始连续编号。要使用位标志,您需要手动将它们编号为2的幂。

答案 2 :(得分:1)

如果您使用的是.NET 4.0,则可以使用Enum.HasFlag()方法检查枚举是否包含特定的位值。请参阅this问题中的答案。