2013-09-26 3 views
63

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

Когда я пытаюсь сделать это, я получаю постоянное значение ошибка времени компиляции. Есть ли другой способ, кроме вычисления этих полномочий 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 
} 
+5

Я бы использовал регулярное перечисление с помощью HashSet. – billpg

+0

Из любопытства, почему значения должны повышаться в силе 2? – deed02392

+4

@ deed02392: из-за флага характер этого перечисления. Вы можете комбинировать несколько значений. Каждое значение «имеет» один бит в значении. 'AZ + AK' будет 6. Используя полномочия 2, избегайте нежелательного столкновения комбинаций. –

ответ

121

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

Вы бы быть на самом деле хорошо, если вы использовали суффикс L, чтобы заставить его быть long дословный - но это все-таки не идеально, чтобы указать их все вручную. (Это не «очевидно, правильно» при чтении кода.)

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

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

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

+17

Вы говорите, что вы не знаете всех цифр каждой силы двух, по крайней мере, до 2^64 наизусть? Вы лопнули мой пузырь! –

+93

@ MichaelKjörling: Ну, конечно * Я * делаю, но я тоже должен считать простых смертных ... –

+1

Я должен представить, что смещение битов также является * более быстрым, чем набирать ... Если вы не можете ввести бесконечные слова в минута. –

8

Если вы не измените к использованию без десятичной нотации, где полномочия 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, 
... 
+0

-1: это лучше, но это не правильный ответ. – ANeves

+0

Не отвечает на вопрос. –

+0

Но он обращается к _problem_, который заключается в том, что есть трудности с вводом, проверкой и пониманием констант перечисления, когда они указаны в базе 10. Одно из решений заключается в том, чтобы автоматически генерировать, по просьбе OP, другое - переключиться на более ясную основу , Обновленный ответ, чтобы отразить это лучше, я надеюсь. – Tom

1

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

Смежные вопросы