Partager via


Portée étendue de nameof

Remarque

Cet article est une spécification de fonctionnalité. La spécification sert de document de conception pour la fonctionnalité. Elle inclut les changements de spécification proposés, ainsi que les informations nécessaires à la conception et au développement de la fonctionnalité. Ces articles sont publiés jusqu'à ce que les changements proposés soient finalisés et incorporés dans la spécification ECMA actuelle.

Il peut y avoir des différences entre la spécification de la fonctionnalité et l'implémentation réalisée. Ces différences sont consignées dans les notes pertinentes de la réunion de conception linguistique (LDM).

Pour en savoir plus sur le processus d'adoption des speclets de fonctionnalité dans la norme du langage C#, consultez l'article sur les spécifications.

Problème de champion : https://github.com/dotnet/csharplang/issues/373

Récapitulatif

Autorisez nameof(parameter) à l’intérieur d’un attribut sur une méthode ou un paramètre. Exemple :

  • [MyAttribute(nameof(parameter))] void M(int parameter) { }
  • [MyAttribute(nameof(TParameter))] void M<TParameter>() { }
  • void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }

Motivation

Les attributs tels que NotNullWhen ou CallerExpression doivent faire référence à des paramètres, mais ces paramètres ne sont pas actuellement pris en compte.

Conception détaillée

Méthodes

Les type_parameters de la méthode sont dans la portée de la method_declaration et peuvent être utilisés pour former des types dans cette portée dans les clauses return_type, method_body et type_parameter_constraints_clauses mais pas dans les attributes, sauf à l'intérieur d'une expression nameof dans les attributs.

Paramètres de méthodes

Une déclaration de méthode crée un espace de déclaration distinct pour les paramètres, les paramètres de type et les variables locales. Les noms sont introduits dans cet espace de déclaration par la liste des paramètres de type et la liste formelle des paramètres de la méthode et par les déclarations de variables locales dans le bloc de la méthode. Les noms sont introduits dans cet espace de déclaration par la liste des paramètres de type et la liste des paramètres formels de la méthode dans les expressions nameof dans les attributs placés sur la méthode ou ses paramètres.

[...]
Dans le bloc d’une méthode, les paramètres formels peuvent être référencés par leurs identificateurs dans les expressions simple_name (noms simples) Dans une expression nameof dans les attributs placés sur la méthode ou ses paramètres, les paramètres formels peuvent être référencés par leurs identifiants dans des expressions simple_name.

Signatures de fonctions anonymes

L'étendue des paramètres de la fonction anonyme est définie par le corps de la fonction anonyme (§7.7), ainsi que par les expressions et nameof dans les attributs placés sur la fonction anonyme ou ses paramètres.

Déclaration de délégué

La portée des paramètres du délégué est nameof les expressions dans les attributs placés sur la déclaration, ses paramètres de type ou ses paramètres.

Noms simples

Un simple_name est soit de la forme I, soit de la forme I<A1,...,Ak>, où I est un identifiant unique et <A1,...,Ak> un type_argument_list facultatif. Lorsqu’aucune type_argument_list n’est spécifiée, considérez K comme étant égal à zéro. Le simple_name est évalué et classé comme suit :

  • Si K est égal à zéro et que simple_name apparaît dans un bloc et si l’espace de déclaration de variable locale (Déclarations) du bloc (ou d’un bloc englobant) contient une variable locale, un paramètre ou une constante portant le nom I, le simple_name fait référence à cette variable locale, paramètre ou constante et est classé comme variable ou valeur.
  • Si K est égal à zéro et que simple_name apparaît dans le corps d’une déclaration de méthode générique et si cette déclaration inclut un paramètre de type portant le nom I, alors le simple_name fait référence à ce paramètre de type.
  • Si K est égal à zéro et que simple_name apparaît dans une expression nameof dans un attribut sur la déclaration de méthode ou ses paramètres, et si cette déclaration inclut un paramètre ou paramètre de type portant le nom I, le simple_name fait référence à ce paramètre ou paramètre de type.
  • Sinon, pour chaque type d’instance T (le type d’instance), en commençant par le type d’instance de la déclaration de type englobante immédiatement et en continuant avec le type d’instance de chaque classe englobante ou déclaration de struct (le cas échéant) :
    [...]
  • Sinon, pour chaque espace de noms N, en commençant par l’espace de noms dans lequel apparaît le simple_name, en continuant avec chaque espace de noms englobant (le cas échéant) et en terminant par l’espace de noms global, les étapes suivantes sont évaluées jusqu’à ce qu’une entité soit trouvée :
    [...]
  • Sinon, le simple_name est indéfini et une erreur de compilation survient.

Étendues

  • L'étendue d'un paramètre de type déclaré par une liste de paramètres de type sur une déclaration de méthode est [...] et les expressions nameof dans un attribut de la déclaration de méthode ou de ses paramètres.
  • La portée d'un paramètre déclaré dans une déclaration de méthode (Méthodes) est le method_body de cette déclaration de méthode et les expressionsnameof dans un attribut de la déclaration de méthode ou de ses paramètres.