我在我的应用程序中使用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
}
答案 0 :(得分:125)
当我尝试这样做时,我得到常量值编译时错误。
如果您使用L
后缀强制它为long
字面值,您实际上没问题 - 但是仍然不是必须手动指定它们。 (阅读代码时,这不是“明显正确”。)
您不能使用Math.Pow
因为表达式必须是编译时常量 - 但您可以使用位移:
None = 0,
AL = 1L << 0,
AK = 1L << 1,
AZ = 1L << 2
等。我认为无论如何都更具可读性:)
答案 1 :(得分:9)
如果更改为使用非小数表示法,其中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,
...
答案 2 :(得分:1)
我很想考虑使用BitArray作为底层结构。