Mot-clé « dynamique » C#… est-ce vraiment un mot-clé RÉSERVÉ ou simplement un identifiant qui signifie quelque chose de spécial lorsqu'il est utilisé comme type ?
-
22-09-2019 - |
Question
J'ai un analyseur C# 4.0.Il accepte « dynamique » comme mot-clé et comme type.Mon analyseur se déclenche sur les déclarations trouvées dans les programmes de travail C # 3.0 de la forme de:
dynamic = <exp> ;
Alors, c'est vraiment un mot-clé dynamique ?Ou peut-il toujours être utilisé comme nom d’identifiant arbitraire ?(Si oui, pourquoi « int » n'est-il pas traité de la même manière) ?
Existe-t-il une spécification de référence quelque part indiquant si Dynamic est un mot-clé ?La dernière spécification ECMA C# 4 ne mentionne même pas « dynamique », et le mieux que je puisse trouver sur le site MS est une « spécification préliminaire » qui dit que c'est un mot-clé mais je soupçonne que c'est juste une écriture bâclée.
La solution
dynamic
est un mot-clé contextuelle à partir de C # 4.0. La quatrième édition du ECMA C # spec ne se réfère pas à C # 4.0. (Notez la date de publication 2006).
MSDN décrit comme un mot-clé.
Il est aussi dans cette table des mots clés contextuels . (Faites défiler la liste.)
Autres conseils
Il est pas un mot-clé "normal" comme if
, for
etc.
Il est contextuelle mot-clé comme yield
, from
etc.
occupe en particulier,:
object dynamic = 0; // dynamic is a contextual keyword
mais cela ne fait pas:
object string = 0; // string is a regular keyword
Il faudrait "échapper" string
comme ceci:
object @string = 0;
Cela fait beaucoup de sens en termes de compatibilité ascendante: il est peu probable que beaucoup de gens ont créé un type appelé dynamic
(qui provoquerait l'ambiguïté, IIRC le type « vrai » gagne dans ce cas ) alors qu'il est très probable que le code existant utilise des variables appelé dynamic
.
D'une certaine façon, il n'a même pas besoin d'être un mot-clé contextuel (et je ne crois pas que la spécification jamais réfère explicitement en tant que tel) - vous pouvez penser comme le nom d'un type qui est toujours disponible (comme string
et object
). Je suppose que string
etc ont été faits à partir de mots-clés v1 pour éviter toute confusion, mais en ajoutant des mots-clés véritables (qui ne peuvent pas être utilisés comme identifiants) aurait un coût élevé de compatibilité maintenant.
C'est un mot-clé. (voir modification ci-dessous) Je suis un peu confus quant à ce que vous entendez par "pourquoi 'int' n'est-il pas traité de la même manière ?"
Vous ne pouvez pas faire ceci : int int = 5;
Mais vous pouvez faire ceci, même si ce n'est pas une bonne pratique : int @int = 5;
Le Spécification C# 4.0 mentionne dynamic
à l'article 20.1.
MODIFIER:Plus d'informations...
Utiliser Dynamic comme nom de variable est autorisé, ce n'est donc pas un mot-clé (mais c'est un mot-clé contextuel - voir Le message de Sean Devlin).Voir la capture d'écran ci-dessous utilisant .NET 4.0 bêta
Découvrez celui de Chris Burrow article de blog.Une citation intéressante du post :
Comme vous pouvez le voir, les membres visibles publiquement qui utilisent la dynamique de type, dans les coulisses, utilisent l'objet type lorsqu'ils sont émis.Il n'y a pas de type de framework «dynamique». Cependant, ces «objets» sont tous décorés de telle manière que le compilateur (ou n'importe qui d'autre) peut dire qu'ils sont censés être manipulés dynamiquement.