2012-04-13 2 views
6

von this question, weiß ich, dass eine die Verkettung von const Dinge sein kann. Nun, ein Enum ist nur ein Satz von Ganzzahlen, oder? Warum ist es nicht in Ordnung, dies zu tun:Wie wird ein Enum-Wert in eine Const-Zeichenfolge eingeschlossen?

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

oder dies:

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

Und wie würden Sie einen Enum-Wert in einer const String enthalten?

Beispiel für eine reale Lebensdauer: Beim Erstellen einer SQL-Abfrage möchte ich "where status <> " + StatusEnum.Discarded haben.

+2

Als Vermutung dafür, warum: eine ganze Zahl verketten Kultur Abhängigkeitsprobleme beinhalten. Ihr 'int.ToString()' ist möglicherweise nicht mit meinem 'int.ToString()' identisch. Vielleicht. Nur eine Vermutung. Insbesondere negative Zahlen, vielleicht. –

+0

oh, richtig, ich habe die Frage nicht genau gelesen. Es geht also nicht nur um Enums, es ist auch unmöglich, const-ganze Zahlen in eine const-Zeichenkette einzuschließen. – Zonko

+1

ja; 'const String foo =" abc "+ 1;' schlägt identisch –

Antwort

6

Als Abhilfe, können Sie einen Feldinitialisierer anstelle einem const verwenden, dh

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

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

Was, warum: für den Enum Fall Enum Formatierung eigentlich ziemlich komplex ist, vor allem für die [Flags] Fall, so ist es sinnvoll, dies der Laufzeit zu überlassen. Für den Fall int könnte dies möglicherweise noch von kulturspezifischen Problemen betroffen sein, also erneut: muss bis zur Laufzeit zurückgestellt werden. Was der Compiler tatsächlich erzeugt ein Kasten Betrieb hier, das heißt mit der string.Concat(object,object) Überlastung, identisch mit:

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

wo string.Concat die .ToString() zuführen. Als solche könnte man argumentieren, dass die folgende etwas effizienter ist (vermeidet eine Box und einen virtuellen Aufruf):

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

die string.Concat(string,string) verwenden würde.

+0

+1 für große Erklärung – ABH

4

Sie müssen readonly oder static readonly anstelle von const verwenden.

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

Der Grund MyEnum.Value1 nicht als const behandelt wird, besteht darin, dass ein Methodenaufruf den Wert in einen String, und das Ergebnis eines Methodenaufrufes wird nicht benötigt wird als ein konstanter Wert, selbst wenn das Verfahren behandelt zu konvertieren Argumente sind konstant.

+0

ok für den String-Wert, aber warum für den Integer-Wert der Enumeration? – Zonko

+0

@ Zonko Kultur Probleme? –

+0

@Zonko, ruft die kompilierte automatisch 'int32.ToString()' auf den Integer-Wert, um es in eine Zeichenfolge zu konvertieren, bevor es die Zeichenfolgen verkettet. –

2

Dies ist nicht möglich, da MyEnum.Value1 und (int)MyEnum.Value1 keine konstanten string Werte sind. Es wird eine implizite Konvertierung zum Zeitpunkt der Zuweisung geben.

Verwenden Sie einen static readonly string statt:

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