Битовые флаги всегда включают значение 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
предположить, что это исключение из всех других вариантов, так в чем проблема?