超过2 ^ 32的枚举标志

我在我的应用程序中使用枚举标志。 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 } 

当我尝试这样做时,我得到一个恒定的编译时错误。

如果你使用L后缀来强制它成为一个long文字,你实际上可能会好起来,但是仍然不是很好的手动指定它们。 (阅读代码时不是“显然是正确的”。)

您不能使用Math.Pow因为expression式必须是编译时常量 – 但您可以使用位移:

 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, ... 

我会试图考虑使用BitArray作为底层结构。