Используйте Flags Enum space как целое число - PullRequest
0 голосов
/ 04 ноября 2018

Могу ли я использовать пространство между флагами Enum для хранения целых чисел? Я только что попробовал это:

[Flags]
public enum Occupation : int
{
    Open=16,
    Flagged = 32,
    Bomb = 64 
}

В моем ожидании это должно привести к следующему перечислению:

0b0 ... 0
0b1 ... 1
0b10 ... 2
.
.
0b1111 ... 15
0b10000 ... Open
0b10001 ... Open + 1
0b10010 ... Open + 2
.
.
0b011111 ... Open + 15
0b100000 ... Flagged
0b100001 ... Flagged + 1
.
0b101111 ... Flagged + 15
0b110000 ... Flagged, Open
0b110001 ... Flagged, Open + 1

и так далее. Я надеялся, что Enum просто проигнорирует значения между флагами, но кажется, что они все установлены в 0 (или нет), если я бит-и Enum, как это:

Occupation occ = Occupation.Open; //initialize the enum with a Flag
occ += 8; //add 8 to the first bits of the enum without touching the Flags
Console.WriteLine((occ & (Occupation) 8 ).ToString());
//Expected Output: 8
//Actual Output: 0

Согласно этой документации там должно быть возможно "хранить некоторые значения" там (по крайней мере, если вы приведете его к целому числу). Должен ли я повсеместно приводить его из целого числа или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 04 ноября 2018

Как упомянуто в комментариях dlatikay , действительно возможно хранить целое число перед Flags в перечислении. Я просто использовал неправильное целое число, чтобы извлечь число. Поскольку флаги всегда имеют степень 2, число для извлечения должно быть на единицу меньше, чем первый флаг. В этом примере первый флаг равен 16. Таким образом, вы можете хранить числа до 15 в этом перечислении, а также использовать 15 для извлечения.

Пример:

[Flags]
public enum MyEnum
{
    FlagA = 16,          //0b010000
    FlagB = 32,          //0b100000
}

.
.

MyEnum e = MyEnum.FlagA; //0b010000
e += 6;                  //0b010000 + 0b000110 EQUALS 0b010110
int x = (int)e & 15      //15=0b001111 AND e=0b010110 EQUALS 0b000110
Console.Write(x);        //6
Console.WriteLine(e.HasFlag(MyEnum.A)); //true
...