2014-07-25 14 views
5

Ich habe eine große C# -Klasse, die nur mit public const string Felder gefüllt ist. Allerdings habe ich in einem Fall bin versucht, einen String und einen Enum-Wert in ein const string Feld verketten, wie folgt aus:Constate Constant String und Enum

public const string GET_VALUES = "SELECT * FROM [tbl] WHERE [id] = " + Enum.Val; 

Allerdings bekomme ich diesen Compiler-Fehler:

'Namespace.SqlStatements.GET_VALUES' must be constant 

Ich weiß, ich könnte lösche die const Klausel, aber ich möchte alle Felder innerhalb dieser Klasse konsistent halten. Ist es möglich, eine konstante Zeichenfolge und eine Enum in C# zu verketten?

+4

Sie können 'public readonly' verwenden ... Sie können' const' nicht verwenden, da eine const-Zeichenfolge zur Kompilierzeit bekannt sein muss. String-Verkettung mit einem Enum-Wert erfordert die String-Transformation dieses Enum-Wertes - etwas, das während der Laufzeit und nicht während der Kompilierung des Programms passiert. – elgonzo

+0

@elgonzo Gute Idee, aber das passt nicht ganz zu der Konsistenz, die ich erwähnt habe, die ich zu behalten versuchte. Wenn es keinen anderen Weg gibt, dann wäre "readonly" der richtige Weg. –

+1

Ich erweiterte meinen ersten Kommentar. Sehen Sie dort, warum Sie in diesem Fall nicht "const" verwenden können ... – elgonzo

Antwort

5

Von MSDN:

A constant expression is an expression that can be fully evaluated at compile time. Therefore, the only possible values for constants of reference types are string and a null reference.

In Ihrem Fall wird die Enum haben in einen String umgewandelt werden ToString verwenden, die bei der Kompilierung nicht möglich ist. Ich schlage vor, Sie ändern es zu readonly als Elgonzo erwähnt.

+0

Allerdings rufe ich 'ToString()' auf der Enum nicht auf, ich suche nach seinem ganzzahligen Wert. Also der Enum-Wert kann nicht zur Kompilierzeit aufgelöst werden? –

+0

Nun, nein, das wird implizit vom Compiler gemacht. – Chris

+0

Ok! Klingt gut für mich. Vielen Dank! –