Во-первых, вы, вероятно, предполагаете что-то ложное:
enum MyEnum
{
One = 1;
Two = 2;
}
var three = (MyEnum)3; //is this legal?
Да, это так, что скомпилируется просто отлично. Возможно, это плохой выбор, если MyEnum
не является битовым полем (атрибут [Flags]
), но не применяется компилятором. Вероятно, было бы неплохо, если бы в языке проводилось различие между перечислениями и флагами, потому что это совершенно разные вещи, но этот поезд долго проходил через go.
Если с другой стороны enum
- это битовое поле, тогда oring - это must , потому что параметры перечисления не являются исключительными (в этом и заключается весь смысл флагов), и это было бы не очень полезно, если бы вам пришлось подойти с каждой возможной допустимой комбинацией при определении типа enum
:
[Flags]
enum AnimalTraits
{
None = 0
Reptile = 1 << 0,
Mammal = 1 << 1,
Vertebrate = 1 << 2,
Invertebrate = 1 << 3,
Amphybious = 1 << 4,
Acuatic = 1 << 5,
//etc.
}
var myAnimalFlags = AnimalTraits.Invertebrate |
AnimalTraits.Amphybious |
AnimalTraits.Reptile
Теперь у вас есть значение enum, для которого установлены эти три флага, которые могут быть полезны для фильтрации данных, настройки параметров в некотором пользовательском интерфейсе и т. д. c.