103 votes

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

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

public class var { }

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

Le var utilisé 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 lorsque je fais ceci :

public class int { }

ou ceci :

public class true { }

Le compilateur dit que int ou true est un mot-clé et ne peut pas être utilisé de cette manière. Pourquoi n'est-ce pas la même chose avec var ?

6 votes

Pourquoi voulez-vous? Tellement confus et difficile à lire.

0 votes

Que dire du mot clé dynamique ? Peut-il également être utilisé ?

6 votes

101voto

Sam Holder Points 13935

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 lequel est votre classe et lequel est le mot-clé contextuel, et aucune confusion ne se produit.

un mot-clé contextuel est:

utilisé pour fournir un sens spécifique dans le code, mais ce n'est pas un mot réservé en C#.

donc comme ce n'est pas réservé vous pouvez l'utiliser.

Comme mentionné dans les commentaires ci-dessus, il y a une discussion sur les 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 Lippert

Il est intéressant de noter que depuis que l'ensemble des mots-clés a été décidé dans C#1.0, il n'y a pas eu d'ajout, afin de préserver la compatibilité ascendante.

1 votes

Cependant, il est classé sous "Mots-clés de C#" ici msdn.microsoft.com/en-us/library/bb383973.aspx ... déroutant!

4 votes

Mais c'est un Mot-clé Contextuel. "Un mot-clé contextuel est utilisé pour fournir une signification spécifique dans le code, mais il n'est pas un mot réservé en C#. Certains mots-clés contextuels, tels que partial et where, ont des significations spéciales dans deux contextes ou plus."

5 votes

@TimSchmelter Ensuite "var" est un "mot-clé". Juste pas un "mot réservé", n'est-ce pas?

18voto

Oded Points 271275

Le compilateur est assez intelligent pour savoir que le contexte dans lequel vous utilisez var en tant que nom de classe n'est jamais un contexte pour le mot-clé, alors il le permet (c'est pourquoi il est défini comme un mot-clé contextuel).

0 votes

Je pense que cette réponse est au moins quelque peu trompeuse. Le compilateur n'est pas exactement "assez intelligent" pour déterminer si var est utilisé comme un mot-clé dans du code tel que var testVar = new var();. Oui, le contexte, en termes de savoir si un type personnalisé nommé var a été défini, entre en jeu, mais c'est précisément parce que le compilateur n'est pas assez intelligent dans ces cas pour savoir si var testVar fait référence à la classe var ou au mot-clé var qu'il se rabat sur la classe dans un tel contexte. Si le mot-clé var était nommé différemment, il pourrait être utilisé dans le même "contexte".

0 votes

Contrastez cela avec d'autres mots-clés contextuels, tels que add - ici, le compilateur sait en effet à chaque occurrence si le mot-clé est destiné (déclaration d'événement; un identificateur n'aurait aucun sens là-bas), ou si le code fait référence à un identificateur (type ou nom dans une déclaration, utilisation de l'identificateur dans le corps d'une méthode; le mot-clé n'aurait aucun sens là-bas).

12voto

ShellShock Points 4268

Une autre manière de voir les choses : "var" en tant que mot-clé n'était pas dans les premières versions de C# (contrairement à "int" et "true"), donc vous auriez pu écrire du code qui avait une classe appelée "var". C'était parfaitement acceptable et légal. Ensuite, lorsque "var" a été ajoutée au langage, les concepteurs ont eu la gentillesse de la rendre 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 de langage - comment ajouter de nouvelles fonctionnalités sans casser le code existant, et sans rendre les nouvelles fonctionnalités contraignantes à utiliser.

8voto

dtb Points 104373

Dans les versions de C# antérieures à la version 3, les variables locales de type implicite n'étaient pas encore prises en charge, donc var n'avait pas de signification spéciale et il était possible de définir des variables et des classes nommées var. Votre programme d'exemple est légal, car les deux occurrences de var dans main se réfèrent à la classe var.

Les versions de C# 3 et ultérieures sont rétrocompatibles, donc le code écrit en C# avant la version 3 compile toujours avec les nouveaux compilateurs.

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

3voto

pfries Points 785

Les mots-clés peuvent être réservés de manière contextuelle. Lorsque le code source est analysé, ce contexte est établi en tant que partie de l'arbre d'analyse. L'évaluation des mots-clés a lieu dans ce contexte. Ainsi, dans ce cas, var n'est pas dans un contexte réservé et n'aura pas le même sens que lorsque vous l'utilisez dans une instruction d'affectation. Je crois qu'une des raisons de cette flexibilité est que var a été introduit dans C# 3, donc le rendre réservé partout aurait pu casser la compatibilité ascendante dans certains programmes, alors que l'utiliser comme déclaration de type de variable n'aurait pas été compilé dans les versions antérieures, donc il n'y a pas de rupture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X