0

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

[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。据我了解,它应该做一些明智的 AND 操作并检查是否有 singleleagueSelected 并返回 false。

这很奇怪,我所有的谷歌搜索都说这很简单而且很有效,但对于我的生活来说,我无法得到它。/羞愧地低着头。

4

3 回答 3

5

默认情况下,枚举将具有值 0、1、2、3、...。AFAIK 添加 FlagsAttribute 不会改变这一点。我认为您需要明确设置所需的值,例如:

[Flags]
public enum ConsoleStates : byte
{
    TopLevel = 0,
    All = 1,
    MainMenu = 2,
    SingleLeagueSelected = 4,
}
于 2011-11-15T23:13:28.673 回答
2

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

于 2011-11-15T23:11:20.563 回答
1

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

于 2011-11-15T23:16:46.043 回答