Как использовать флаг в условии if - PullRequest
1 голос
/ 01 января 2012

У меня есть условие if для 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;
}

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

Ответы [ 4 ]

3 голосов
/ 01 января 2012

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

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

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

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

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

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

1 голос
/ 01 января 2012

Когда вы используете [Flags], значение перечисления должно быть в Base 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
    }

1 голос
/ 01 января 2012

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

Также измените выражение if на

if (type.HasFlag(EmploymentType.Type1) || type.HasFlag(EmploymentType.Type2))
0 голосов
/ 01 января 2012

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

if (type == EmploymentType.Type1 || type == EmploymentType.Type2)
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...