【问题标题】:HasFlag() always returns true in Enum foreach statementHasFlag() 在 Enum foreach 语句中总是返回 true
【发布时间】:2016-03-04 08:50:53
【问题描述】:

感谢您花时间尝试帮助我。

我遇到了一个相当奇怪的问题。我正在尝试遍历所有 Enum 值以检查我的对象是否包含 Enum 标志。但由于某种原因,我不太明白,在 foreach 中它说它总是有标志。但在单独的 if 语句中,它确实按我想要的方式工作。但我不想重复代码 6 次,所以我想让 foreach 语句正常工作。

有人知道发生了什么吗?也许一些背景信息为什么会发生?

对不起,我的英语不是我的母语。

提前致谢!

代码与原始代码有所不同,但基本相同。

代码如下。

[Flags]
public enum SampleEnum
{
    Enum1 = 0,
    Enum2 = 1,
    Enum3 = 2,
    Enum4 = 4,
    Enum5 = 8,
    Enum6 = 16,
};

SampleEnum sample = SampleEnum.Enum1 | SampleEnum.Enum2;



    // This doesn't work
    foreach (SampleEnum enum in Enum.GetValues(typeof(SampleEnum)))
    {
      // This is statement says it allways has the flags. Even tho it doesn't have the flag.
        if(sample.HasFlag(enum))
        {
            // This is always true.
        }
    }

    // This works
    if (sample.HasFlag(SampleEnum.Enum2))
    {
        // true
    }

    // This works
    if (sample.HasFlag(SampleEnum.Enum3))
    {
        // false
    }


    // This works
    if (sample.HasFlag(SampleEnum.Enum4))
    {
        // false
    }
}

【问题讨论】:

  • 如果您输入Enum.GetValues(typeof(MainSettings.ConnectedPrinters)).Cast<MainSettings.ConnectedPrinters>(),它会起作用吗? GetValues 返回类型是非通用的 Array
  • .HasFlag 总是计算为真的循环中,printGroup 的值是多少?

标签: c# foreach enums flags


【解决方案1】:

我似乎记得有一个值为 0 的元素意味着当使用带有 [Flags] 指令的 HasFlag 时,所有内容都包含该元素。试试这个代码:

Enum.GetValues(typeof(MainSettings.ConnectedPrinters)).Cast<MainSettings.ConnectedPrinters>().Where(v => (int)v > 0).ToList())

这将在没有 0 值标志的情况下迭代列表。

【讨论】:

  • 谢谢!情况确实如此。由于我没有 15 分,因此我无法将您的答案标记为正确。 :(
  • @AlexanderDerck 啊,我明白了,如果你先点击upvote,它不会因为该消息而注册接受按钮。
【解决方案2】:

您永远不应该使用 0 值创建标志枚举,因为它会将元素与 0 进行按位比较。

AnyEnumItem & 0 总是等于 0。

编辑:“所有项目”除外

【讨论】:

  • “你永远不应该”是强词夺理。您可能想要一个代表它的标志 f。例如,关于权限 - 0 表示全部。
  • 谢谢,我更新了答案并为 0 值添加了“All”枚举成员。
【解决方案3】:

来自MSDNHasFlag

如果 flag 的基础值为零,则该方法返回 true

您应该在使用HasFlag之前检查零。

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 2015-12-16
    • 2016-05-10
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多