2016-03-04 4 views
0

Спасибо, что нашли время, чтобы попробовать помочь мне.HasFlag() всегда возвращает true в заявлении Enum foreach

Я столкнулся с довольно странной проблемой. Я пытаюсь просмотреть все значения Enum, чтобы проверить, содержит ли мой объект флаг Enum. Но по какой-то причине, что я не совсем понимаю, в предсказании говорится, что у него всегда есть флаг. Но в отдельных операторах 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 ​​является не общим «массивом». –

+0

Какова ценность printGroup в цикле, где '.HasFlag' всегда принимает значение true? – Edin

ответ

3

Кажется, я припоминаю, что наличие элемента со значением 0 означает, что все содержит, что при использовании HasFlag с [Flags] директивы. Попробуйте этот код:

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

Это приведет к повторному исполнению списка без знака 0.

+0

Спасибо! Это действительно так. Тo Я не могу отметить ваш ответ как правильный, так как у меня нет 15 очков. :( – CareX

+0

@CareX Вы можете, вы просто не можете продвинуться до 15 баллов –

+0

@AlexanderDerck А я вижу, apperent, если вы нажмете сначала вверх, он не зарегистрирует кнопку accept из-за этого сообщения. – CareX

1

От MSDN о HasFlag:

Если базовая величина флага равен нулю, то метод возвращает истинную.

Перед использованием HasFlag вы должны проверить нуль.

2

Вы никогда не должны создавать флаги Enum со значением 0, как это будет делать побитовое сравнение элемента с 0.

AnyEnumItem & 0 всегда равен 0.

Edit: для «Все, кроме пункта "

+1

«Вы никогда не должны» это сильные слова. Возможно, вы захотите иметь флаг, который представляет его, fe, на разрешениях - 0 может указывать все. –

+0

Спасибо, я обновил свой ответ и добавил член списка «Все» для значения 0. – Panda

Смежные вопросы