флаг проверки 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. Насколько я понимаю, она должна выполнять битовую операцию AND и проверять, есть ли там singleleagueSelected, и возвращать false.

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


person Jon    schedule 15.11.2011    source источник
comment
повесил голову от стыда... как и следовало бы. Эту проблему было бы очень легко найти с помощью отладчика, если бы вы только попытались. SO не должен заменять отладчик, задайте вопрос, когда вы пробовали пошаговое выполнение и все еще застряли.   -  person Ben Voigt    schedule 16.11.2011
comment
@BenVoigt Я неоднократно пробовал отладчик и просматривал, что происходит. Не делайте предположений!   -  person Jon    schedule 16.11.2011


Ответы (3)


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

[Flags]
public enum ConsoleStates : byte
{
    TopLevel = 0,
    All = 1,
    MainMenu = 2,
    SingleLeagueSelected = 4,
}
person Dennis    schedule 15.11.2011
comment
Вы правы насчет FlagsAttribute. stackoverflow.com/questions/5902967 / - person Ritch Melton; 16.11.2011
comment
Ах, тогда, возможно, это была моя ошибка. Я думал, что он сделал правильные битовые значения, необходимые по умолчанию. - person Jon; 16.11.2011

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

person drdwilcox    schedule 15.11.2011
comment
Правильно. Простое добавление атрибута [Flags] не меняет нумерацию по умолчанию. - person Ben Voigt; 16.11.2011

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

person Bryan Crosby    schedule 15.11.2011