N'est-ce pas var
un mot-clé en C #? Mais pourquoi puis-je faire ça:
public class var { }
public class main
{
public static void main(string[] args)
{
var testVar = new var();
}
}
Le var
qui est utilisé dans le code est la var
classe qui est déclarée avant la main
classe. Et le compilateur ne se plaint même pas.
Pendant que je fais ça:
public class int { }
ou ca:
public class true { }
Le compilateur a dit que int
ou true
est un mot clé et ne peut pas être utilisé comme ça. Pourquoi n'en est-il pas de même var
?
var var = "var";
dans une méthode. Après tout, c'est vendredi.Réponses:
var
n'est pas un mot-clé selon cette liste .c'est un mot clé contextuel, donc à partir du contexte, le compilateur est capable de décider quelle est votre classe et quel est le mot clé contextuel, et aucune confusion ne survient.
un mot-clé contextuel est:
comme il n'est pas réservé, vous pouvez l'utiliser.
Comme indiqué dans les commentaires ci-dessus, il y a une discussion des différences ainsi qu'une liste des différents mots-clés et mots-clés contextuels ajoutés à chaque version de c # sur le blog d'Eric Lipperts
Il est intéressant de noter que depuis que l'ensemble des mots-clés a été décidé en C # 1.0, il n'y a pas eu d'ajouts, afin de préserver la compatibilité ascendante.
la source
Contextual Keyword
. "Un mot clé contextuel est utilisé pour fournir une signification spécifique dans le code, mais ce n'est pas un mot réservé en C # . Certains mots clés contextuels, tels que partial et where, ont une signification particulière dans deux contextes ou plus."var
tout ne se cassait pas lors de la mise à niveau de C #.Le compilateur est suffisamment intelligent pour savoir que le contexte que vous utilisez
var
comme nom de classe n'est jamais un contexte pour le mot-clé, donc le permet (c'est pourquoi il est défini comme un mot-clé contextuel ).la source
var
est utilisé comme mot clé dans du code commevar testVar = new var();
. Oui, le contexte, en termes de savoir si un type personnalisé nommé avar
été défini, joue dedans, mais c'est précisément parce que le compilateur n'est pas assez intelligent dans ces cas pour savoir s'ilvar testVar
fait référence à la classevar
ou au motvar
- clé qu'il par défaut à la classe dans un tel contexte. Si levar
mot - clé était nommé différemment, il pourrait être utilisé dans le même «contexte».add
- ici, le compilateur sait en effet à chaque occurrence si le mot-clé est destiné (déclaration d'événement; identifiant n'aurait aucun sens là-bas), ou si le code fait référence à un identifiant (type ou nom dans une déclaration, utilisation de l'identifiant dans le corps d'une méthode; le mot clé n'aurait aucun sens ici)Une autre façon de voir ceci: "var" en tant que mot clé n'était pas dans les premières versions de C # (contrairement à "int" et "true"), vous avez donc peut-être écrit du code qui avait une classe appelée "var". C'était parfaitement bien et légal. Puis plus tard, lorsque "var" a été ajouté au langage, les concepteurs ont eu la gentillesse d'en faire un mot-clé uniquement dans certains contextes, de sorte que votre classe var existante fonctionnerait toujours.
C'est l'un des vrais défis de la conception de langage - comment ajouter de nouvelles fonctionnalités sans casser le code existant et sans rendre les nouvelles fonctionnalités fastidieuses à utiliser.
la source
Dans les versions C # antérieures à la version 3, les variables locales typées implicitement n'étaient pas encore prises en charge, elles
var
n'avaient donc aucune signification particulière et il était possible de définir des variables et des classes nomméesvar
. Votre exemple de programme est légal, car les deux occurrences devar
in fontmain
référence à la classevar
.C # 3 et les versions ultérieures sont compatibles vers le bas, donc le code écrit en C # avant la version 3 se compile toujours avec les nouveaux compilateurs.
int
ettrue
sont des mots-clés depuis C # 1.la source
Les mots clés peuvent être réservés de manière contextuelle. Lorsque le code source est analysé, ce contexte est établi dans le cadre de l'arborescence d'analyse. L'évaluation des mots-clés a lieu dans ce contexte. Donc, dans ce cas, var n'est pas dans un contexte réservé et n'aura pas la même signification que lorsque vous l'utilisez dans une instruction d'affectation. Je pense qu'une des raisons de cette flexibilité est que var a été introduit dans C # 3, donc le rendre réservé partout pourrait avoir rompu la compatibilité descendante dans certains programmes, alors que l'utiliser comme une déclaration de type variable n'aurait pas été compilé dans les versions précédentes, il n'y a donc pas rupture.
la source