[英]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。
編輯:“所有項目”除外
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.