2010-12-02 4 views
8

Je viens juste de me retrouver en train d'utiliser from comme identifiant.Quand les mots clés C# ne sont-ils pas réservés?

Je me rends compte qu'il est possible d'utiliser @ pour échapper les noms d'identifiants et en tant que tels utiliser des mots réservés, mais je ne comprends pas pourquoi dans ce cas je n'ai pas eu d'avertissement ou d'erreur. Je n'ai aucune envie d'utiliser des mots réservés à d'autres fins que celles pour lesquelles ils ont été conçus, mais je ne veux pas refaire une erreur similaire et j'aimerais savoir pourquoi les mots-clés de langue ne sont pas réservés dans certaines circonstances.

+2

Certains mots-clés ont été ajoutés après l'écriture de beaucoup de code, comme le mot-clé 'from' de Linq. Il pourrait casser beaucoup de code existant s'il était impossible de l'utiliser. En outre, comme mentionné, certains mots-clés sont seulement dans certains contextes. – Pedro

+0

Pour une analyse des différentes règles pour savoir quand les mots clés ont des significations particulières, voir http://blogs.msdn.com/b/ericlippert/archive/tags/keywords/ –

Répondre

13

Certains mots-clés sont uniquement réservés dans certains contextes, par exemple partial dans partial class.

Voir les "mots-clés contextuels" sous this topic on MSDN.

+0

Donc, il semblerait, mais quelle est la logique et où est-il documenté dans la spécification? – PeterT

+0

+1 Exactement. L'analyseur peut faire la différence entre 'var from = ...' et 'var q = from ...'. – StriplingWarrior

+3

La justification est dans le lien MSDN que j'ai posté; Pour citer: "Généralement, lorsque de nouveaux mots-clés sont ajoutés au langage C#, ils sont ajoutés en tant que mots-clés contextuels afin d'éviter de casser des programmes écrits dans des versions antérieures." –

2

Ils ne sont pas réservés quand ils sont contextuelle (MSDN link):

Un mot-clé contextuelle est utilisée pour fournir une signification particulière dans le code , mais ce n'est pas un mot réservé C#. Certains mots clés contextuels, tels que partiel et où, ont des significations spéciales dans deux ou plusieurs contextes.

4

L'équipe C# essaie spécifiquement d'éviter de créer de nouveaux mots-clés réservés dans la langue. Tout nouveau mot-clé ajouté signifie qu'il casse automatiquement le code existant qui a utilisé ce mot-clé comme identifiant. Donc, chaque fois que possible, C# utilisera un mot-clé contextuel pour minimiser ou éliminer la possibilité de casser le code existant.

Un mot-clé contextuelle est celui qui est seulement un mot-clé lorsqu'il est utilisé dans un contexte spécifique comme from, partial, var, etc ... Ce contexte ne comprend pas les identificateurs :)

Je ne crois pas qu'il y ait eu nouveau mot clé ajouté depuis C# 2.0 (même pas sûr que 2.0 en a ajouté un)

3

de est un 'mot clé contextuel'. Beaucoup de ceux en C#, ils ne se comportent comme un mot clé que lorsqu'ils sont utilisés dans un certain contexte. Le gros avantage est que l'ajout d'un tel mot-clé contextuel au langage ne viendra pas à bout du code existant.

Vous les trouverez dans le 2ème tableau de ce MSDN page. Yup, de est là.

0

La plupart des mots-clés C# sont toujours réservés. Certains, comme vous l'avez découvert, ne sont réservés que dans certains contextes. Ils sont appelés mots-clés contextuels. Je crois que c'est un moyen de mieux assurer la rétrocompatibilité.

Le raisonnement est que from était un nom de variable parfaitement acceptable dans C# 2. C# 3 a ajouté LINQ, et ils avaient besoin de mots-clés pour cela. Afin de maintenir une compatibilité maximale, from a été ajouté en tant que mot-clé contextuel.

1

Pour répondre à la question sous-jacente:

Tous les mots-clés ajoutés après C# 1 sont contextuels.Cela évite les changements de rupture.

Presque tous les mots-clés C# 1 sont réservés, à l'exception des mots-clés accesseurs (add, remove, get et set).