枚举标志超过2 ^ 32

Cha*_*aru 67 c# enums flags

我在我的应用程序中使用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
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 125

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

如果你使用L后缀来强制它是一个long文字,你实际上是可以的- 但是必须手动指定它们仍然不理想.(阅读代码时,这"显然不正确".)

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

None = 0,
AL = 1L << 0,
AK = 1L << 1,
AZ = 1L << 2
Run Code Online (Sandbox Code Playgroud)

我认为无论如何都更具可读性:)

  • @MichaelKjörling:当然可以*我*,但我也要考虑凡人...... (94认同)
  • 你是说你不知道每个两个幂的所有数字至少最多2 ^ 64的心脏?你破了我的泡泡! (17认同)
  • @PatrickM Jon的情况也是如此. (3认同)
  • @RobH我拿了子弹.把自己打昏! (3认同)

Tom*_*Tom 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,
...
Run Code Online (Sandbox Code Playgroud)