簡體   English   中英

HasFlag()始終在Enum foreach語句中返回true

[英]HasFlag() always returns true in Enum foreach statement

感謝您抽出寶貴的時間來幫助我。

我遇到了一個很奇怪的問題。 我試圖遍歷所有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
    }
}

我似乎還記得,使用值為0的元素意味着在將HasFlag與[Flags]指令一起使用時,所有內容都包含該元素。 試試這個代碼:

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之前,應檢查零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM