HasFlag() 总是在 Enum foreach 语句中返回 true

本文关键字:语句 foreach 返回 true Enum HasFlag | 更新日期: 2023-09-27 18:37:24

感谢您抽出宝贵时间尝试帮助我。

我遇到了一个相当奇怪的问题。我正在尝试遍历所有枚举值以检查我的对象是否包含枚举标志。但是出于某种原因,我不太明白,在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
    }
}

HasFlag() 总是在 Enum foreach 语句中返回 true

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

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

这将迭代没有 0 值标志的列表。

切勿创建具有 0 值的 Flags 枚举,因为它会将元素与 0 进行按位比较。

AnyEnumItem & 0 始终等于 0。

编辑 : "所有项目"除外

来自 MSDN 关于 HasFlag

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

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