2016-03-04 83 views
0

感謝您花時間嘗試幫助我。HasFlag()總是在Enum的foreach語句中返回true

我遇到了一個相當奇怪的問題。我試圖循環所有的枚舉值來檢查我的對象是否包含枚舉標誌。但由於某種原因,我不太明白,它說它總是有國旗。但在單獨的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

如果你把'Enum.GetValues(typeof(MainSettings.ConnectedPrinters))。Cast ()'是否工作呢? 'GetValues' returntype是非通用的'Array'。 –

+0

在'.HasFlag'總是評估爲true的循環中,printGroup的值是多少? – Edin

回答

3

我似乎記得,具有值0的元素是指一切包含使用與[旗]指令的HasFlag時。試試這個代碼:

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

這將迭代沒有0值標誌的列表。

+0

謝謝!事實確實如此。我無法將你的答案標記爲正確,因爲我沒有15分。 :( – CareX

+0

@CareX你可以,你只是不能upvote,直到15分 –

+0

@AlexanderDerck啊我看到,如果你先點擊upvote apperent,它不會註冊接受按鈕,因爲該消息 – CareX

1

MSDNHasFlag

如果標誌的基本值是零,則該方法返回

你應該使用HasFlag之前檢查零。

2

你不應該創建標誌0值枚舉,因爲它會做的元素的逐位比較0

AnyEnumItem & 0總是等於0

編輯:除了「全項目「

+1

「你永遠不應該」你可能希望有一個代表它的標誌,fe,在權限 - 0可以表示全部。 –

+0

謝謝,我更新了我的答案併爲0值添加了「全部」枚舉成員。 – Panda