флаг проверки перечисления всегда возвращает true - PullRequest
0 голосов
/ 16 ноября 2011

Я, должно быть, делаю что-то очень глупое, но я не вижу, что.В простом консольном приложении у меня есть:

[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 и вернули ли вы ложь.

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

Ответы [ 3 ]

5 голосов
/ 16 ноября 2011

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

[Flags]
public enum ConsoleStates : byte
{
    TopLevel = 0,
    All = 1,
    MainMenu = 2,
    SingleLeagueSelected = 4,
}
2 голосов
/ 16 ноября 2011

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

1 голос
/ 16 ноября 2011

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

...