В отношении ": int", определяющего базовый тип, если бы я увидел это, я бы осмотрелся и посмотрел, не исключают ли они все свои перечисления таким образом. Если так, то они, вероятно, только что научились писать перечисления таким образом (или, может быть, они являются гипер-явным кодером). Однако, если только это перечисление было объявлено таким образом, возможно, программист пытается что-то сказать (что могло бы быть лучше сказано с комментарием), что важно, чтобы это имело базовый тип «int». Возможно, он где-то сериализован или десериализован в двоичном формате.
Что касается атрибута [Flags], то, что касается C #, вы можете использовать побитовые операторы для любого перечисления, а не только для тех, которые объявлены с [Flags]. Из приведенного выше примера, без каких-либо флагов, абсолютно законно следующее:
abc myAbcValue = значение1 | значение2;
Основное отличие от [Flags] заключается в методах ToString () и Parse () Enum. Без [Flags] myAbvValue.ToString () вернет «3», но с [Flags] вернет «значение1, значение2». Аналогично с [Флаги],
abc yourAbcValue = (abc) Enum.Parse (typeof (abc), "value1, value2");
установит базовое значение yourAbcValue в 3.
Обратите внимание, что метод IsDefined () функции Enum () не допускает использование нескольких значений с перечислениями [Flags], поэтому:
Enum.IsDefined (typeof (abc), "value1, value2")
возвращает false независимо от использования [Flags].
Также обратите внимание, что [Flags] предоставляет информацию для любого доступа к отражению, а другие языки могут трактовать ограничение помеченных перечислений иначе, чем обычные перечисления.