2016-03-04 38 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