В чем разница между этими двумя объявлениями enum [Flags] (C #) - PullRequest
3 голосов
/ 22 мая 2011

Это больше вопрос, который я прошу понять, а не выяснить проблему.Рассмотрим следующие два:

[Flags]
    public enum Flags
    {
        NONE = 0x0,
        PASSUPDATE = 0x1,
        PASSRENDER = 0x2,
        DELETE = 0x4,
        ACCEPTINPUT = 0x8,
        FADE_IN = 0x10,
        FADE_OUT = 0x20,
        FADE_OUT_COMPLETE = 0x40
    }

[Flags]
    public enum Flags
    {
        NONE = 0x0,
        PASSUPDATE,
        PASSRENDER,
        DELETE,
        ACCEPTINPUT,
        FADE_IN ,
        FADE_OUT,
        FADE_OUT_COMPLETE
    }

Если я выполняю битовую проверку чего-либо с использованием последнего перечисления, то иногда возникает совпадение (я думаю, что что-то вроде DELETE интерпретируется как PASSUPDATE | PASSRENDER, тогда как в первом примере каждыйзапись не зависит от других (т. е. DELETE имеет значение только DELETE и не может быть доказано с использованием комбинации другого набора флагов).

1 Ответ

12 голосов
/ 22 мая 2011

Без явных чисел перечисления увеличиваются на 1 каждый раз (даже с указанным [Flags]), поэтому вы получаете:

[Flags]
public enum Flags
{
    NONE = 0x0,
    PASSUPDATE, // = 1
    PASSRENDER,// = 2
    DELETE,// = 3
    ACCEPTINPUT,// = 4
    FADE_IN ,// = 5
    FADE_OUT,// = 6
    FADE_OUT_COMPLETE// = 7
}

, что просто не то число, которое вы хотели (и, конечно, не битовоефлаги, которые обычно имеют следующие степени 2)

...