Pourquoi puis-je créer une classe nommée “var”?

Est-ce que var n’est pas un mot-clé en C #? Mais pourquoi puis-je faire ceci:

 public class var { } public class main { public static void main(ssortingng[] args) { var testVar = new var(); } } 

La var utilisée dans le code est la classe var déclarée avant la classe main . Et le compilateur ne se plaint même pas.

Alors que quand je fais ceci:

 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’est-ce pas la même chose avec var ?

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 se produit.

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 #.

donc 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 Eric Lipperts.

Il est intéressant de noter que le jeu de mots-clés ayant été choisi dans C # 1.0, il n’ya pas eu d’additions, afin de préserver la compatibilité avec les versions antérieures.

Le compilateur est assez intelligent pour savoir que le contexte dans lequel vous utilisez var tant que nom de classe n’est jamais un contexte pour le mot clé, donc l’autorise (ce qui explique pourquoi il est défini en tant que mot clé contextuel ).

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. Ensuite, lorsque “var” a été ajouté à la langue, 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 véritables défis de la conception linguistique: comment append de nouvelles fonctionnalités sans casser le code existant, sans rendre les nouvelles fonctionnalités plus lourdes à utiliser.

Dans les versions C # antérieures à la version 3, les variables locales implicitement typées n’étaient pas encore sockets en charge, donc var n’avait pas de signification particulière et il était possible de définir des variables et des classes nommées var . Votre exemple de programme est légal, car les deux occurrences de var in main référence à la classe var .

C # 3 et les versions ultérieures sont compatibles vers le bas, donc le code écrit en C # avant la version 3 est toujours compatible avec les nouveaux compilateurs.

int et true sont des mots-clés depuis C # 1.

Les mots-clés peuvent être réservés contextuellement. Lorsque le code source est analysé, ce contexte est établi dans le cadre de l’arbre d’parsing. 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 que l’une des raisons de cette flexibilité est que var a été introduit dans C # 3, le rendre réservé partout peut donc avoir une compatibilité ascendante avec certains programmes, alors que l’utiliser comme une déclaration de type variable rupture.