Битовые флаги всегда включают значение 0

Итак, я наткнулся на этот код:

[Flags]
public enum Options
{
    NA = 0,
    OptionA = 1,
    OptionB = 2,
    OptionC = 4
}

Теперь, технически, "NA" недопустимо, если пользователь не хочет выбирать какие-либо опции, он просто не выберет ни одного, и он получит сохранения в обнуляемый тип int. Нет варианта "Нет". Тем не менее, каждый раз, когда пользователь выбирает параметры AC, NA также будет добавляться. Если я изменю NA = 1, затем OptionC = 8, все работает хорошо. Эта часть имеет смысл. Но почему NA всегда будет включен в список опций пользователя, если NA = 0?

Редактировать:

Чтобы прояснить некоторые вопросы, NA является эксклюзивным, но если я выберу вариант OptionB, то при просмотре выбранных параметров будет показано, что я выбрал NA и OptionB.

2 ответа

Решение

Когда вы добавляете Flags в качестве атрибута перечисления и значения, равного 0, оно всегда будет включено, если вы используете & отфильтровать значения.

Это связано с тем, что все обязательные биты (в этом случае ни один) не установлены.

Если вы собираетесь использовать перечисление с Flags атрибута, тогда используйте значение 0, только если у вас есть опция, которая исключает все другие опции (например, None, например). Затем вы проверяете это с помощью:

if (myOptions == Options.Na)

Тестирование с:

if ((myOptions & Options.Na) == Options.Na)

Будет, конечно, всегда возвращать истину.

Теперь имя Na предположить, что это исключение из всех других вариантов, так в чем проблема?

Другие вопросы по тегам