2016-03-04 1 views
0

Merci d'avoir pris le temps d'essayer de m'aider.HasFlag() renvoie toujours la valeur true dans Enum foreach statement

J'ai rencontré un problème plutôt étrange. J'essaie de parcourir toutes les valeurs Enum pour vérifier si mon objet contient le drapeau Enum. Mais pour une raison quelconque, que je ne comprends pas tout à fait, dans le foreach il dit qu'il a toujours le drapeau. Mais dans les instructions séparées, cela fonctionne exactement comme je le voulais. Mais je ne veux pas répéter le code 6 fois, donc j'aimerais que la déclaration foreach fonctionne.

Est-ce que quelqu'un sait ce qui se passe? Peut-être quelques informations de base pourquoi cela se passe-t-il?

Désolé pour mon anglais, ce n'est pas ma langue maternelle.

Merci d'avance!

Le code est différent de l'original, mais il est essentiellement le même.

Code ci-dessous.

[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

Si vous mettez' Enum.GetValues ​​(typeof (MainSettings.ConnectedPrinters)). Cast () 'fonctionne-t-il alors? Le type de retour 'GetValues' est non générique' Array'. –

+0

Quelle est la valeur de printGroup, à la boucle où '.HasFlag' est toujours vrai? – Edin

Répondre

3

me semble me rappeler que d'avoir un élément avec la valeur 0 signifie que tout contient que lorsque vous utilisez la hasFlag avec la directive [Flags]. Essayez ce code:

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

Ceci va itérer la liste sans l'indicateur de valeur 0.

+0

Merci! C'était en effet le cas. Je ne peux pas marquer votre réponse comme correcte puisque je n'ai pas 15 points. :( – CareX

+0

@CareX Vous pouvez, vous ne pouvez pas upvote jusqu'à 15 points –

+0

@AlexanderDerck Ah je vois, apéritif si vous cliquez sur upvote d'abord, il ne enregistre pas le bouton d'acceptation à cause de ce message – CareX

1

De MSDN à propos HasFlag:

Si la valeur sous-jacente de drapeau est égal à zéro, la méthode renvoie vrai.

Vous devez rechercher zéro avant d'utiliser HasFlag.

2

Vous ne devez jamais créer des drapeaux ENUM avec une valeur 0 car il va faire la comparaison de l'élément binaire avec 0.

AnyEnumItem & 0 est toujours égal à 0.

Edit: Sauf pour un « Tous les articles "

+1

"Vous ne devriez jamais" Vous pouvez avoir un drapeau qui le représente, par exemple, sur les permissions - 0 pourrait tout indiquer –

+0

Merci, j'ai mis à jour ma réponse et ajouté le membre "All" enum pour la valeur 0. – Panda