2013-02-27 15 views
8

Ho un enumEnum ToString appare come una serie

private enum TimeUnit 
{  
    Day, 
    Month, 
    Year 
} 

E sto popolando una descrizione con:

return string.Concat(unit, "(s)"); 

Dove unità è un TIMEUNIT. La maggior parte delle volte funziona bene e visualizza "Giorni (s)" tuttavia su un server particolare che viene visualizzato come "1 (s)"

Che cosa causerebbe questo?

+3

la mia ipotesi sarebbe diverse versioni di. NET in esecuzione? lo risolvi aggiungendo semplicemente unit.ToString() – Marthin

+1

Sarei curioso di sapere cosa rende questo display in modo diverso. Se è la versione .NET, quando è stata modificata e perché? –

+1

@Marthin Credo che probabilmente hai ragione con la versione .NET (non volevo inserire la mia risposta nella domanda), tuttavia string.Concat dovrebbe causare un implicito ToString() quindi sono scettico che semplicemente aggiungendolo sarà cambiare senza dare informazioni di formattazione. – Liath

risposta

5

Provare a utilizzare Enum.GetName()

ha anche il vantaggio di essere safer poiché richiede:

  • Il valore inserito non è nullo.
  • Il valore passato è di un tipo che un'enumerazione può effettivamente utilizzare come tipo sottostante o del tipo di enumerazione stesso. Usa GetType sul valore per verificare questo.
+2

'enum's non può essere nullo, gran parte di questa è la sicurezza schizofrenica. –

+0

punto equo, ho appena copiato e incollato. Modifica ora. – happygilmore

+0

Ho inviato questa correzione - ovviamente devo aspettare una distribuzione sul server prima di sapere se è corretta! – Liath

0

Perché Enum è enumerazione digitale optionnalyexpressed con le stringhe (considerarli alias)

+2

Sì, ma questo non spiega perché due diverse caselle devono eseguire l'operazione ToString in un modo diverso. – Liath

3

Si dovrebbe formattare in modo appropriato utilizzando ToString:

return string.Concat(unit.ToString("F"), "(s)"); 
0

MSDN dice:

Questo metodo funziona come se il carattere generale format, "G", erano specificato. Cioè, se FlagsAttribute non è applicato a questo tipo enumerato e c'è una costante denominata uguale al valore di questa istanza, quindi il valore di ritorno è una stringa contenente il nome della costante. Se viene applicato FlagsAttribute e c'è una combinazione di una o più costanti con nome uguale al valore di questa istanza , il valore restituito è una stringa contenente un elenco separato dalimitatore di nomi dei costanti. In caso contrario, il valore di ritorno è la rappresentazione in formato stringa del valore numerico di questa istanza .

Quindi, in posizione ideale nel tuo caso dovrebbe funzionare bene (considerando FlagsAttribute non viene applicata e c'è un nome costante pari al valore di questa istanza). Puoi menzionare le differenze tra le scatole?

Inoltre, provare a dare numeri espliciti.

private enum TimeUnit 
{  
    Day = 1, 
    Month = 2, 
    Year = 3 
} 
+1

L'assegnazione di valori espliciti non farebbe differenza. – Groo

+0

@Groo, sono d'accordo. Tuttavia, in base alla descrizione di MSDN, sembra * che stia correndo nel caso 3 (altrimenti, il valore di ritorno è la rappresentazione in stringa del valore numerico di questa istanza). Quindi, forse la variabile unitaria ha un valore al di fuori dell'intervallo di enum (anche se 1 come '1 (s)' dovrebbe essere all'interno). Con informazioni limitate, è una congettura. – publicgk