c# - unity - Enum flags más de 2 ^ 32
enum flags unity (3)
Cuando trato de hacer eso obtengo un error de compilación en tiempo constante .
De hecho, estarías bien si usaras el sufijo L
para forzarlo a ser un long
literal, pero aún así no es ideal tener que especificarlos todos manualmente. (No es "obviamente correcto" al leer el código).
No puede usar Math.Pow
ya que la expresión tiene que ser una constante en tiempo de compilación, pero puede usar el cambio de bit:
None = 0,
AL = 1L << 0,
AK = 1L << 1,
AZ = 1L << 2
etc. Yo diría que es más legible de todos modos :)
Estoy usando banderas de Enum en mi aplicación. El Enum puede tener más de 50 valores, por lo que los valores van hasta 2 ^ 50. Me preguntaba si puedo usar Math.Pow(2, variable)
para calcular esto.
Cuando trato de hacer eso obtengo un error de compilación en tiempo constante . ¿Hay alguna otra manera, aparte de calcular estos poderes de 2 manualmente y ponerlo?
Esto es lo que estoy haciendo:
[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
}
Estaría tentado de considerar usar BitArray como la estructura subyacente.
Si cambia a usar notación no decimal donde las potencias de 2 son más regulares, entonces ya no necesitará generarlas automáticamente, por ejemplo:
// 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,
...