HasFlag()始终在Enum foreach语句中返回true

时间:2016-03-04 08:50:54

标签: c# foreach enums flags

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

我遇到了一个相当奇怪的问题。我试图遍历所有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
    }
}

3 个答案:

答案 0 :(得分:3)

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

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

这将迭代列表而不带0值标志。

答案 1 :(得分:2)

你永远不应该创建带有0值的Flags枚举,因为它会将元素与0进行按位比较。

AnyEnumItem&amp; 0总是等于0.

编辑:“所有项目”除外

答案 2 :(得分:1)

MSDN关于HasFlag

  

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

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