2012-01-01 3 views
1

У меня есть условие для Enum. Мое перечисление:Как использовать флаг, если условие

public enum EmploymentType 
{ 
    Type1 = 1, 
    Type2 = 2, 
    Type3 = 3 
} 

и это условие

EmploymentType type = EmploymentType.Type1 ; 

if (type.HasFlag(EmploymentType.Type1 | EmploymentType.Type2)) //if (type == (EmploymentType.Type1 | EmploymentType.Type2)) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

Ожидаемые истинный результат для этого условия, но результат является ложным. Зачем?

+0

Почему нет, если '(тип == EmploymentType.Type1 || типа == EmploymentType.Type2)' –

+1

Прочтите следующее: [Enum Flags Attribute] (http://stackoverflow.com/questions/8447/enum-flags-attribute). –

ответ

3

Там несколько вещей, которые вы делаете неправильно здесь:

  • Ваше перечисление не имеет атрибут [Flags] , HasFlags предназначен для работы только с перечислениями с этим набором атрибутов.

  • Вы не следуете правилам флага. Если Type3 - это комбинация Type1 и Type2, она должна иметь значение 4 вместо 3. Прочитайте документацию в FlagsAttribute MSDN page.

  • Ваши ожидания неправы: HasFlag(Flag1 | Flag2) возвращает только правдивые из как flag1 и flag2 установлены, так как вы побитовое ИЛИ -ную flag1 и flag2 и проверки, если эти биты установлены. Пожалуйста, посмотрите на HasFlag documentation для деталей.

Я подозреваю, что ваше перечисление предназначается, чтобы быть просто перечисление и не является контейнером для флагов. Флаги должны быть объединены, т. Е. Тип может быть «Type1 и Type2» или «no type» или «all types» (например, форматирование шрифта, которое может быть «none», «bold», «italic», жирный и курсивный »,« смелый и подчеркнутый »и т. д.). Я не думаю, что это относится к вашему делу.

Итак, забудьте о флаге и просто используйте регулярное перечисление enum (например, type == EmploymentType.Type1 || type == EmploymentType.Type2 или инструкцию switch) вместо метода HasFlags.

1

Ваше перечисление не имеет атрибута [Flags].

изменить Также ваше если заявление

if (type.HasFlag(EmploymentType.Type1) || type.HasFlag(EmploymentType.Type2)) 
+1

Значения перечисления не равны двум, поэтому их использование как флагов не будет работать. – hvd

+2

И в дополнение к '[Флаги]' нумерация должна быть 1,2,4,8, ... –

+0

Казалось странным, что он использовал флаги вообще (в выражении if), не заметил, что третье значение в перечислении на самом деле не было 4 ... –

0

| не означает, что вы думаете, что делает, и, вероятно, лучше прямо сейчас осталось необъясненным. Важно то, что для проверки «если или б», вы можете использовать if (a || b):

if (type == EmploymentType.Type1 || type == EmploymentType.Type2) 
{ 
    ... 
} 
1

При использовании [Flags] значение перечисления должно быть в базе 2 (Binary)

 

    [Flags] 
    enum Days2 
    { 
     None = 0x0, 
     Sunday = 0x1, 
     Monday = 0x2, 
     Tuesday = 0x4, 
     Wednesday = 0x8, 
     Thursday = 0x10, 
     Friday = 0x20, 
     Saturday = 0x40 
    } 

    [Flags] 
    public enum Pet { 
     None = 0, 
     Dog = 1, 
     Cat = 2, 
     Bird = 4, 
     Rabbit = 8, 
     Other = 16 
    } 

+0

Хотелось бы увидеть DogBirdRabbit;) – BlueChippy