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