Я поделюсь интересным использованием, с которым я сталкивался в прошлом. Этот пример бесстыдно скопирован из дополнительного ответа на вопрос: « Что означает атрибут Enum [Flags] в C #? »
[Flags]
public enum MyEnum
{
None = 0,
First = 1 << 0,
Second = 1 << 1,
Third = 1 << 2,
Fourth = 1 << 3
}
Это может быть легче расширить, чем записывать буквальные 1, 2, 4, 8, ...
значения, особенно когда вы пройдете 17 флагов.
Компромисс: если вам нужно более 31 флага (1 << 30
), вам также нужно быть осторожным, указав свой enum как нечто с более высокой верхней границей, чем целое число со знаком (объявив его public enum MyEnum : ulong
например, который даст вам до 64 флагов). Это потому что ...
1 << 29 == 536870912
1 << 30 == 1073741824
1 << 31 == -2147483648
1 << 32 == 1
1 << 33 == 2
Напротив, если вы установите значение enum непосредственно в 2147483648, компилятор выдаст ошибку.
Как отмечает ClickRick, даже если ваше перечисление происходит от ulong, ваша операция сдвига битов должна выполняться для ulong, иначе значения перечисления все равно будут нарушены.
[Flags]
public enum MyEnum : ulong
{
None = 0,
First = 1 << 0,
Second = 1 << 1,
Third = 1 << 2,
Fourth = 1 << 3,
// Compiler error:
// Constant value '-2147483648' cannot be converted to a 'ulong'
// (Note this wouldn't be thrown if MyEnum derived from long)
ThirtySecond = 1 << 31,
// so what you would have to do instead is...
ThirtySecond = 1UL << 31,
ThirtyThird = 1UL << 32,
ThirtyFourth = 1UL << 33
}