2011-07-25 7 views
13

Tengo la siguiente definición de enumeración (en C#):Enum.GetNames() resultados en orden inesperado con enumeración negativa constantes de

public enum ELogLevel 
{ 
    General = -1, // Should only be used in drop-down box in Merlinia Administrator log settings 
    All = 0,  // Should not be used as a level, only as a threshold, effectively same as Trace 
    Trace = 1, 
    Debug = 2, 
    Info = 3, 
    Warn = 4, 
    Error = 5, 
    Fatal = 6, 
    Off = 7  // Should not be used as a level, only as a threshold 
} 

Ahora, cuando hago un Enum.GetNames() en este tipo Puedo obtener una matriz de cadenas con 9 elementos como se esperaba, pero el orden es All, Trace, ..., Off, General, que no es lo que esperaba.

Aquí está el MSDN documentation para Enum.GetNames():

"Observaciones: Los elementos de la matriz valor de retorno están ordenados por los valores de las constantes enumeradas."

¿Qué está pasando aquí? Puedo cambiar mi programa para tener en cuenta esta "funcionalidad", pero me gustaría saber por qué .NET está haciendo lo que está haciendo.

+0

Sugeriría enviar un informe de error a Microsoft. –

+0

Ya no es un error, es una característica que está [ahora documentada] (http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx): "Los elementos de la matriz están ordenados por los valores binarios de las constantes de enumeración (** es decir, por su magnitud sin signo **) ". – jason

Respuesta

17

Esta es una fallo conocido con tanto GetNames() y GetValues() que se informó here, pero terminó siendo cerrado que no va a arreglar:

Sí, de hecho, este método tiene un error en el que se devuelve el conjunto de valores de enumeración ordenada como sin signo tipos (-2 es 0xFFFFFFFE y -1 es 0xFFFFFFFF en el complemento a dos, por eso se muestran al final de la lista) en lugar de devolver el valor s ordenados por sus tipos firmados.

Desafortunadamente, no podemos cambiar el orden de clasificación de GetValues ​​porque vamos a romper todos los programas .NET existentes que se han escrito a depender del comportamiento actual de clasificación [...]

Parece que se le tiene que reordenar los valores usted mismo.

+0

"programas .NET existentes que se han escrito para depender del comportamiento de clasificación actual" Y esta es la razón por la que no se agrupa en detalles de implementación. – BoltClock

+1

Seguramente si la implementación siempre ha sido y se romperá de esta manera, entonces tendría sentido para MS actualizar la documentación para que coincida con el comportamiento real. – LukeH

+0

@LukeH: Exactamente. Incluso el reportero de errores dijo lo mismo. – BoltClock

2

Dependiendo de cómo se produce la clasificación, puede ser que está clasificando los valores como si fueran sin signo, en cuyo caso, -1 = 0xFFFFFFFF, que es por supuesto mayor que 7.

+1

Es ciertamente posible, y parece explicar las cosas, pero ciertamente sería extraño dado que el tipo subyacente por defecto para un 'enum' es' int'. – jason

+0

Parece que mi conjetura es confirmada por la respuesta de BoltClock a continuación. – Iridium

Cuestiones relacionadas