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)
Cosa succede se si imposta un punto di interruzione, quindi si valutano le espressioni '.ToString' nella finestra Immediata? – Dai
È una copia di copia completa? L'extra, alla fine non mi sembra giusto – Paparazzi
@ Bam, no non è completo; come detto, è solo un frammento. – nateirvin