Флаги перечисляют странные значения - PullRequest
0 голосов
/ 23 февраля 2019
[Flags]
public enum Direction
{
    None = 0x0000,
    Left = 0x0001,
    Right = 0x0002,
    Up = 0x0004,
    Down = 0x0008,
    Forward = 0x0016,
    Backward = 0x0032
}

Действительно запутанный, я использую это перечисление в выражении if, например:

if ((enumValues & Direction.Forward) == Direction.Forward)
{
    // do stuff
}

, чтобы проверить, содержит ли он флаг внутри коллекции.

if ((enumValues & Direction.Right) == Direction.Forward)
{
    // do stuff
}

Продолжает запускать этот код if ( Direction.Right ), несмотря на то, что внутри коллекции нет флага Right, я даже отлаживал его с помощью разрывов, и значение не содержит Direction.Right, но он по-прежнему возвращает true и запускает фрагмент.

Неправильно ли я настроил свой enum или неправильно запрашиваю значения?

Я не использую флаги обычно, я просто подумал, что это было бы неплохо.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Видя, как вы определили ваше перечисление:

None = 0x0000,
Left = 0x0001,
Right = 0x0002,
Up = 0x0004,
Down = 0x0008,
Forward = 0x0016,
Backward = 0x0032

Вы путаете шестнадцатеричные и десятичные числа.

В перечислении [Flags], двоичном представлении значений вашего перечислениядолжно быть примерно так:

0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 1000

В десятичном виде это степени 2: 1, 2, 4, 8, 16 и т. д.

Но способ записи значений начинается с0x, что обозначает шестнадцатеричное значение.Таким образом, вы на самом деле устанавливаете значения для регистра enum как шестнадцатеричные числа 1, 2, 4, 8 и 16.

Вы должны удалить эти 0x:

None = 0,
Left = 1,
Right = 2,
Up = 4,
Down = 8,
Forward = 16,
Backward = 32
0 голосов
/ 23 февраля 2019

Для шестнадцатеричных значений вы должны определить значения следующим образом:

Forward = 0x0010,
Backward = 0x0020

Или в десятичном виде:

Forward = 16,
Backward = 32
...