【问题标题】:enum flag checking flag always returning true枚举标志检查标志总是返回真
【发布时间】:2011-11-15 23:09:31
【问题描述】:

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

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

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

【问题讨论】:

  • “羞愧地垂头丧气”......你也应该这样做。如果您只是尝试过,那么使用调试器很容易找到这个问题。所以不应该替换调试器,当你尝试单步执行但仍然卡住时问一个问题。
  • @BenVoigt 我确实反复尝试调试器并逐步了解正在发生的事情。不要做假设!

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


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 对。仅添加 [Flags] 属性不会更改默认编号。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多