Ist kein var
Schlüsselwort in C #? Aber warum kann ich das tun:
public class var { }
public class main
{
public static void main(string[] args)
{
var testVar = new var();
}
}
Das var
im Code verwendete ist die var
Klasse, die vor der main
Klasse deklariert wird . Und der Compiler beschwert sich nicht einmal.
Während, wenn ich das mache:
public class int { }
oder dieses:
public class true { }
Der Compiler sagte, dass int
oder true
ein Schlüsselwort ist und nicht so verwendet werden kann. Warum ist es nicht dasselbe mit var
?
var var = "var";
in einer Methode tun . Immerhin ist Freitag.Antworten:
var
ist kein Schlüsselwort gemäß dieser Liste .Da es sich um ein kontextbezogenes Schlüsselwort handelt, kann der Compiler anhand des Kontexts entscheiden, welche Ihre Klasse und welches das kontextbezogene Schlüsselwort ist, und es entsteht keine Verwirrung.
Ein kontextbezogenes Schlüsselwort lautet:
Da es nicht reserviert ist, können Sie es verwenden.
Wie in den obigen Kommentaren erwähnt, gibt es eine Diskussion der Unterschiede sowie eine Liste der verschiedenen Schlüsselwörter und Kontextschlüsselwörter, die in jeder Version von c # im Eric Lipperts-Blog hinzugefügt wurden
Es ist interessant festzustellen, dass seit der Festlegung der Schlüsselwörter in C # 1.0 keine Ergänzungen vorgenommen wurden, um die Abwärtskompatibilität zu gewährleisten.
quelle
Contextual Keyword
. "Ein kontextbezogenes Schlüsselwort wird verwendet, um eine bestimmte Bedeutung im Code bereitzustellen. Es ist jedoch kein reserviertes Wort in C # . Einige kontextbezogene Schlüsselwörter, z. B. teilweise und wo, haben in zwei oder mehr Kontexten eine besondere Bedeutung."var
hatte, bricht beim Upgrade von C # nicht alles zusammen.Der Compiler ist klug genug zu wissen, dass der Kontext, den Sie
var
als Klassennamen verwenden, niemals ein Kontext für das Schlüsselwort ist, sodass dies zulässig ist (weshalb er als kontextbezogenes Schlüsselwort definiert ist ).quelle
var
er als Schlüsselwort in Code wie verwendet wirdvar testVar = new var();
. Ja, der Kontext in Bezug darauf, ob ein benutzerdefinierter Typ mit dem Namenvar
definiert wurde, spielt darin eine Rolle , aber genau deshalb, weil der Compiler in diesen Fällen nicht klug genug ist, um zu wissen, ob ervar testVar
sich auf die Klassevar
oder auf das Schlüsselwort bezieht, dasvar
er standardmäßig auf die Klasse verwendet in einem solchen Kontext. Wäre dasvar
Schlüsselwort anders benannt, könnte es im selben "Kontext" verwendet werden.add
- hier - der Compiler weiß tatsächlich bei jedem Auftreten, ob das Schlüsselwort gemeint ist (Ereignisdeklaration; Bezeichner würde dort keinen Sinn ergeben) oder ob sich der Code auf einen Bezeichner bezieht (Typ oder Name in einer Deklaration, Verwendung des Bezeichners innerhalb eines Methodenkörpers (Schlüsselwort würde dort keinen Sinn ergeben).Eine andere Sichtweise: "var" als Schlüsselwort war nicht in den ersten Versionen von C # enthalten (im Gegensatz zu "int" und "true"), daher haben Sie möglicherweise Code geschrieben, der eine Klasse namens "var" hatte. Das war vollkommen in Ordnung und legal. Später, als "var" zur Sprache hinzugefügt wurde, waren die Designer so freundlich, dass sie nur in bestimmten Kontexten zu einem Schlüsselwort wurden, sodass Ihre vorhandene var-Klasse weiterhin funktioniert.
Dies ist eine der wirklichen Herausforderungen beim Sprachdesign - wie man neue Funktionen hinzufügt, ohne vorhandenen Code zu beschädigen und ohne die Verwendung der neuen Funktionen umständlich zu machen.
quelle
In C # -Versionen vor Version 3 wurden implizit typisierte lokale Variablen noch nicht unterstützt,
var
hatten also keine besondere Bedeutung und es war möglich, benannte Variablen und Klassen zu definierenvar
. Ihr Beispielprogramm ist legal, weil beide Vorkommen vonvar
inmain
der Klasse bezeichnetvar
.C # 3 und spätere Versionen sind abwärtskompatibel, sodass in C # geschriebener Code vor Version 3 weiterhin mit den neuen Compilern kompiliert wird.
int
undtrue
sind Schlüsselwörter seit C # 1.quelle
Schlüsselwörter können kontextbezogen reserviert werden. Wenn der Quellcode analysiert wird, wird dieser Kontext als Teil des Analysebaums eingerichtet. Die Bewertung der Schlüsselwörter erfolgt in diesem Kontext. In diesem Fall befindet sich var also nicht in einem reservierten Kontext und hat nicht die gleiche Bedeutung wie bei der Verwendung in einer Zuweisungsanweisung. Ich glaube, ein Grund für diese Flexibilität ist, dass var in C # 3 eingeführt wurde. Wenn Sie es also überall reservieren, kann es in einigen Programmen zu einer Unterbrechung der Abwärtskompatibilität kommen, während die Verwendung als Deklaration für Variablentypen in früheren Versionen nicht kompiliert worden wäre Bruch.
quelle