Anforderungen an Konstantendeklarationen in C♯
Anforderungen an den Typ
Der Typ eines zur Initialisierung einer Konstanten verwendete Initialisierungsausdrucks muß implizit in den Typ der Konstanten konvertierbar sein (so wie der Typ eines Arguments implizit in den Typ des dazugehörigen Parameters konvertierbar sein muß).
Dies erlaubt es, einen int-Ausdruck zur Initialisierung einer double-Konstanten zu verwenden.
Das folgende Programmbeispiel zeigt, wie von solchen Umwandlungen Gebrauch gemacht wird: Ein Literal vom Datentyp »int« wird zur Initialisierung einer Konstanten vom Typ »double« verwendet.
Program.cs
public static class Program
{ public static void Main()
{const double d = 300;
global::System.Console.WriteLine( d ); }}Protokoll
300
Das folgende Beispiel zeigt, daß ein Versuch zur Initialisierung einer int-Konstanten mit einem double -Literal scheitert, weil hier Nachkommastellen verloren gehen würden (selbst wenn sie alle gleich 0 sind).
Program.cs
public static class Program
{ public static void Main()
{const int i = 300.0;
global::System.Console.WriteLine( i ); }}Protokoll
Program.cs(5,19): error CS0266: Cannot implicitly convert type 'double' to 'int'.
Aus Sicht der Sprachspezifikation besteht der Grund für den Fehler darin, daß es laut Sprachspezifikation keine implizite Wandlung von »double« nach »int« gibt.
Von den bisher behandelten Typen ist jeder Typ implizit in sich selbst wandelbar, und der Typ »int« ist nach »double« oder »decimal« wandelbar. Andere Wandlungsmöglichkeiten existieren bei diesen Typen nicht.
- Tabelle
Konstantentyp Typ des Initialisierungsausdrucks
double double, int
decimal decimal, int
int intstring string
ℛ Substitutionsregel Wird ein Ausdruck eines Typs (wie beispielsweise »double«) erwartet, so kann ein Ausdruck eines Typs (wie beispielsweise »int«) angegeben werden, von dem es eine implizite Wandlung in den erwarteten Typ gibt.
Allgemein muß beim Kopieren eines Wertes der Typ des Ausdrucks, der die Quelle des Wert angibt, implizit in den Typ des Ausdrucks, der das Ziel des Kopierens angibt, wandelbar sein. Als Spezialfälle dieser Regel ergeben sich:
- Der Typ eines Argumentausdrucks muß implizit in den Parametertyp wandelbar sein.
- Der Typ eines Initialisierungsausdrucks in einer Konstantendeklaration muß implizit in den Typ der Variablen wandelbar sein.
Anforderungen an die Zeit der Auswertung
Der Wert des Initialisierungsausdrucks einer Konstanten muß bereits während der Übersetzung bekannt sind.
Zur Übersetzungszeit bekannt sind die Werte von Literalen und von Operatorausdrücken mit den bisher behandelten Typen und Operatoren. Die Werte der verwendeten Operanden müssen selber zur Übersetzungszeit bekannt sein.
Durch diese Anforderung werden insbesondere Aufrufe innerhalb von Initialisierungsausdrücken für Konstanten ausgeschlossen.