2011-11-15 5 views
0

Я должен делать что-то очень глупое, но я не вижу, что. В простом консольном приложении у меня есть;флаг проверки флагов enum всегда возвращает true

[Flags] 
public enum ConsoleStates : byte 
{ 
    TopLevel, 
    All, 
    MainMenu, 
    SingleLeagueSelected, 
} 

затем

public class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     p.StartUp(args); 
    } 

    private bool CheckFlag(ConsoleStates targetVal, ConsoleStates checkVal) 
    { 
     return ((targetVal & checkVal) == checkVal); 
    } 

    private void StartUp(string[] args) 
    { 
     int x = 0; 
     ConsoleStates states = (ConsoleStates.All | ConsoleStates.MainMenu); 
     if (CheckFlag(states, ConsoleStates.SingleLeagueSelected)) 
     { 
      x++; 
     } 
    } 
} 

Моя проблема X должна быть равна нулю в конце, но это всегда 1. Как я понимаю, он должен сделать немного мудрое операцию и проверьте, чтобы увидеть, если singleleagueSelected является там и вернуть ложь.

Это очень странно, и весь мой поисковик говорит, что это очень просто и просто работает, но для жизни меня я не могу получить./висит голова в стыде.

+0

«висит голова в стыде» ... а также вы должны. Эта проблема была бы очень легко найти с помощью отладчика, если бы вы только пробовали. SO не должен заменять отладчик, задайте вопрос, когда вы пробовали одношаговый и все еще застреваете. –

+0

@BenVoigt Я неоднократно пробовал отладчик и проходил через то, что происходило. Не делайте предположений! – Jon

ответ

2

Вы перечисление нумеруются последовательно, начиная с 0. Чтобы использовать битовые флаги, вам нужно будет вручную нумеровать их полномочий 2.

+0

Справа. Просто добавление атрибута '[Flags]' не меняет нумерацию по умолчанию. –

5

Перечисления будут иметь значения 0, 1, 2, 3, ... по по умолчанию. AFAIK добавляет FlagsAttribute, это не меняет. Я думаю, вам нужно явно установить нужные значения, например .:

[Flags] 
public enum ConsoleStates : byte 
{ 
    TopLevel = 0, 
    All = 1, 
    MainMenu = 2, 
    SingleLeagueSelected = 4, 
} 
+0

Вы считаете, что вы соответствуете правилам FlagsAttribute. http://stackoverflow.com/questions/5902967/what-does-the-flags-attribute-really-do –

+0

AH, возможно, это была моя ошибка. Я думал, что он по умолчанию использовал правильные битовые значения. – Jon

1

Если вы используете .NET 4.0, вы можете использовать Enum.HasFlag() метод, чтобы проверить, если перечисление содержит определенное значение бита. См. Мой ответ в вопросе this.

+0

круто, не знаю об этом. благодаря – Jon

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