stringvalue net enum define como acceder c# .net enum-flags

c# - net - FlagsAttribute Enum problemas



return enum c# (2)

El problema podría ser con el desbordamiento aritmético.

Específicamente en:

MsgrVersion8 = 1 << 31, MsgrVersion9 = 1 << 32,

Te sugiero que lo hagas:

MsgrVersion8 = 1L << 31, MsgrVersion9 = 1L << 32,

Para evitar el desbordamiento accidental.

Actualizar:

Parece probable ya que el número más pequeño ''toca'' 31 bits, mientras que el más grande ''toca'' 32 bits.

Así que estoy construyendo un cliente MSNP (Windows Live Messenger). Y tengo esta lista de capacidades

public enum UserCapabilities : long { None = 0, MobileOnline = 1 << 0, MSN8User = 1 << 1, RendersGif = 1 << 2, .... MsgrVersion7 = 1 << 30, MsgrVersion8 = 1 << 31, MsgrVersion9 = 1 << 32, }

Lista completa aquí http://paste.pocoo.org/show/383240/

El servidor envía las capacidades de cada usuario al cliente como un entero largo, que yo tomo y lo echo a UserCapabilities

capabilities = Int64.Parse(e.Command.Args[3]); user._capabilities = (UserCapabilities)capabilities;

Esto está bien, y con al menos un usuario (con un valor de capacidad de 1879474220), puedo hacer

Debug.WriteLine(_msgr.GetUser(usr).Capabilities);

y esto producirá

RendersGif, RendersIsf, SupportsChunking, IsBot, SupportsSChannel, SupportsSipInvite, MsgrVersion5, MsgrVersion6, MsgrVersion7

Pero con otro usuario, que tiene el valor de capacidad de (3055849760), cuando hago lo mismo, obtengo el mismo número de salida

3055849760

Lo que me gustaría ver es una lista de capacidades, como ocurre con el otro usuario.

Estoy seguro de que hay una razón muy válida para que esto suceda, pero no importa cuánto intente formularle la pregunta a Google, no estoy encontrando una respuesta.

Por favor, ayúdame :)


La definición de los operadores de cambio significa que solo los 5 bits menos significativos se usan para números de 32 bits y solo los primeros 6 bits para 64 bits; sentido:

1 << 5

es idéntico a

1 << 37

(ambos son 32 )

Al hacerlo:

MsgrVersion9 = 1L << 32

lo convierte en un número de 64 bits, por lo que la corrección de @ leppie funciona; de lo contrario, << se considera primero (y tenga en cuenta que 1<<32 es idéntico a 1<<0 , es decir, 1 ), y luego el 1 resultante se convierte en un long ; entonces sigue siendo 1 .

De §14.8 en la especificación ECMA:

Para los operadores predefinidos, el número de bits a desplazar se calcula de la siguiente manera:

  • Cuando el tipo de x es int u uint , la cuenta de turnos está dada por los cinco bits de bajo orden de conteo . En otras palabras, el recuento de turnos se calcula a partir de count & 0x1F .
  • Cuando el tipo de x es long o long , el recuento de turnos está dado por los seis bits de bajo orden de conteo . En otras palabras, el recuento de turnos se calcula a partir de count & 0x3F .

Si la cuenta de cambios resultante es cero, los operadores de cambios simplemente devuelven el valor de x.

Las operaciones de cambio nunca causan desbordamientos y producen los mismos resultados en el contexto marcado y no verificado