Флаги 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 в качестве базовой структуры.