2012-04-13 17 views
6

da this question, so che uno const string può essere la concatenazione di const cose. Ora, un enum è solo un insieme di numeri interi, non è vero? Allora, perché non è vero ok per fare questo:Come includere un valore enum in una stringa const?

const string blah = "blah " + MyEnum.Value1; 

o questo:

const string bloh = "bloh " + (int)MyEnum.Value1; 

E come si dovrebbe includere un valore di enumerazione in una stringa const?

Esempio di vita reale: quando si crea una query SQL, mi piacerebbe avere "where status <> " + StatusEnum.Discarded.

+2

Come ipotesi per il motivo: concatenare un intero può comportare problemi di dipendenze cultura. Il tuo 'int.ToString()' potrebbe non essere lo stesso del mio 'int.ToString()'. Forse. Solo una supposizione. In particolare, numeri negativi, forse. –

+0

oh, giusto, non ho letto la domanda che ho collegato con molta attenzione. Quindi non si tratta solo di enumerazioni, in realtà è impossibile includere i costanti interi anche in una stringa const. – Zonko

+1

sì; 'const string foo =" abc "+ 1;' fallisce identicamente –

risposta

6

Come soluzione, è possibile utilizzare un inizializzatore campo al posto di un const, cioè

static readonly string blah = "blah " + MyEnum.Value1; 

static readonly string bloh = "bloh " + (int)MyEnum.Value1; 

quanto riguarda il motivo: per la enum caso, la formattazione enum è in realtà piuttosto complessa, soprattutto per il [Flags] caso, quindi ha senso lasciare questo al runtime. Per il caso int, questo potrebbe ancora essere influenzato da problemi specifici della cultura, quindi di nuovo: deve essere posticipato fino al runtime. Quello che il compilatore effettivamente genera una scatola operazione qui, cioè utilizzando il string.Concat(object,object) sovraccarico, identico a:

static readonly string blah = string.Concat("blah ", MyEnum.Value1); 
static readonly string bloh = string.Concat("bloh ", (int)MyEnum.Value1); 

dove string.Concat eseguirà il .ToString(). Come tale, si potrebbe sostenere che il seguente è leggermente più efficiente (evita una scatola e una chiamata virtuale):

static readonly string blah = "blah " + MyEnum.Value1.ToString(); 
static readonly string bloh = "bloh " + ((int)MyEnum.Value1).ToString(); 

che potrebbe usare string.Concat(string,string).

+0

+1 per la grande spiegazione – ABH

4

È necessario utilizzare readonly o static readonly anziché const.

static readonly string blah = "blah " + MyEnum.Value1; 

Il motivo MyEnum.Value1 non è trattata come const è che una chiamata metodo è richiesto per convertire il valore in una stringa, e il risultato di una chiamata di metodo non viene considerato come un valore costante anche se il metodo gli argomenti sono costanti.

+0

ok per il valore stringa, ma perché per il valore intero dell'enum? – Zonko

+0

@Zonko problemi di cultura? –

+0

@Zonko, il compilato chiama automaticamente 'int32.ToString()' sul valore intero per convertirlo in una stringa prima che concateni le stringhe. –

2

Non è possibile eseguire questa operazione, poiché MyEnum.Value1 e (int)MyEnum.Value1 non sono valori costanti string. Ci sarà una conversione implicita al momento del compito.

Utilizzare un static readonly string invece:

static readonly string blah = "blah " + MyEnum.Value1; 
Problemi correlati