Флаги Enum над 2 ^ 32

Я использую флаги Enum в своем приложении. Enum может иметь около 50+ значений, поэтому значения достигают 2 ^ 50. Мне просто интересно, могу ли я использовать Math.Pow(2, variable) для их расчета?

Когда я пытаюсь сделать это, я получаю постоянную ошибку времени компиляции. Есть ли другой способ, кроме вычисления этих полномочий 2 вручную и ввода его?

Вот что я делаю:

[Flags]
internal enum RiskStates : long
    {
        None = 0,
        AL = Convert.ToInt64(Math.Pow(2,0)),
        AK = 2,
        AZ = 4,
        AR = 8,
        CA = 16,
        CO = 32,
        CT = 64,
        DC = 128,
        DE = 256,
        FL = 512,
        GA = 1024,
        HI = 2048,
        ID = 4096,
        IL = 8192,
        IN = 16384,
        IA = 32768,
        KS = 65536,
        KY = 131072,
        LA = 262144,
        ME = 524288,
        MD = 1048576,
        MA = 2097152,
        MI = 4194304
}

Ответ 1

Когда я пытаюсь сделать это, я получаю постоянную ошибку времени компиляции значения.

На самом деле было бы хорошо, если бы вы использовали суффикс L, чтобы заставить его быть литералом long, но все же не идеально, чтобы указать их все вручную. (Это не "очевидно правильно" при чтении кода.)

Вы не можете использовать Math.Pow, поскольку выражение должно быть константой времени компиляции, но вы можете использовать бит-сдвиг:

None = 0,
AL = 1L << 0,
AK = 1L << 1,
AZ = 1L << 2

и т.д.. Я бы утверждал, что все это можно прочитать:)

Ответ 2

Если вы переходите на использование не десятичных обозначений, где полномочия 2 более регулярны, вам больше не нужно будет генерировать их автоматически, например:

// octal
AL = 0001L,
AK = 0002L,
AZ = 0004L,
AR = 0010L,
CA = 0020L,
CO = 0040L,
CT = 0100L,
...

// hexadecimal
AL = 0x001L,
AK = 0x002L,
AZ = 0x004L,
AR = 0x008L,
CA = 0x010L,
CO = 0x020L,
CT = 0x040L,
...

Ответ 3

У меня возникнет соблазн рассмотреть возможность использования BitArray в качестве базовой структуры.