2014-05-08 10 views
6

Sto lavorando con una libreria esterna che ha un enum. Ci sono alcuni membri di questo enum che, quando chiami ToString() su di essi, restituisci il nome di un membro diverso dell'enum.Perché Enum.ToString() non restituisce il nome enum corretto?

Console.WriteLine("TOKEN_RIGHT = {0}", Tokens.TOKEN_RIGHT.ToString()); //prints TOKEN_OUTER 
Console.WriteLine("TOKEN_FROM = {0}", Tokens.TOKEN_FROM.ToString()); //prints TOKEN_FROM 
Console.WriteLine("TOKEN_OUTER = {0}", Tokens.TOKEN_OUTER.ToString()); //prints TOKEN_FULL 

So che quando due membri enum hanno lo stesso valore numerico, è possibile ottenere un comportamento come questo, ma so, da decompilazione e il controllo dei valori in fase di esecuzione, che ogni membro della enum ha un valore unico

Ecco un frammento della definizione del enum (generato da dotPeek):

public enum Tokens 
{ 

    TOKEN_OR = 134, 
    TOKEN_AND = 135, 
    TOKEN_NOT = 136, 
    TOKEN_DOUBLECOLON = 137, 
    TOKEN_ELSE = 138, 
    TOKEN_WITH = 139, 
    TOKEN_WITH_CHECK = 140, 
    TOKEN_GRANT = 141, 
    TOKEN_CREATE = 142, 
    TOKEN_DENY = 143, 
    TOKEN_DROP = 144, 
    TOKEN_ADD = 145, 
    TOKEN_SET = 146, 
    TOKEN_REVOKE = 147, 
    TOKEN_CROSS = 148, 
    TOKEN_FULL = 149, 
    TOKEN_INNER = 150, 
    TOKEN_OUTER = 151, 
    TOKEN_LEFT = 152, 
    TOKEN_RIGHT = 153, 
    TOKEN_UNION = 154, 
    TOKEN_JOIN = 155, 
    TOKEN_PIVOT = 156, 
    TOKEN_UNPIVOT = 157, 
    TOKEN_FROM = 242, 
} 

Perché succede questo? C'è qualcosa che sto sbagliando, o è solo un'altra delle stranezze divertenti di enumerazione in .NET? Se quest'ultimo, c'è una soluzione per questo?

(. Per quello che vale, Tokens fa parte della Microsoft.SqlServer.Management.SqlParser.Parser spazio dei nomi in .NET)

+0

Cosa succede se si imposta un punto di interruzione, quindi si valutano le espressioni '.ToString' nella finestra Immediata? – Dai

+0

È una copia di copia completa? L'extra, alla fine non mi sembra giusto – Paparazzi

+0

@ Bam, no non è completo; come detto, è solo un frammento. – nateirvin

risposta

5

State esaminando due diverse versioni dell'assemblaggio.

vostro codice (a progettazione/compilazione tempo) fa riferimento una versione più recente (dal momento che siete in grado di utilizzare TOKEN_FROM ma quando si controlla la DLL con dotPeek, non è lì). Tuttavia, l'assembly caricato nel runtime è una versione precedente con valori sottostanti diversi che corrispondono in modo errato ai nomi.

Si dovrà indagare su come si fa riferimento a DLL non corrispondenti. Potrebbe essere il framework installato sulla macchina in esecuzione, o forse ci sono progetti nella stessa soluzione che fanno riferimento a versioni diverse, o forse qualche altra ragione (non è possibile determinare dalle informazioni fornite).

Una volta risolto il motivo per cui si stanno facendo riferimento a due versioni diverse e unificate in una singola versione di assieme, il risultato Enum.ToString() dovrebbe essere come previsto.

+0

@ user2864740: Buon punto; L'ho riscritto per riflettere questo. –

+1

Come nota rapida, con questa particolare DLL, il problema deriva dal fatto che Visual Studio utilizza quella DLL (per i progetti di database), ma stavo riferendo una versione precedente ai Riferimenti del mio progetto. – nateirvin

1

suggerisco sonda:

Console.WriteLine("TOKEN_RIGHT = {0}", Tokens.TOKEN_RIGHT.ToString("F")); 

e così via

+1

Si prega di indentare il codice in modo che sia formattato correttamente – rjp

+0

grazie a @RJP, sono novizio – pfebolo

Problemi correlati