Erweiterter nameof
Bereich
Anmerkung
Dieser Artikel ist eine Featurespezifikation. Die Spezifikation dient als Designdokument für das Feature. Es enthält vorgeschlagene Spezifikationsänderungen sowie Informationen, die während des Entwurfs und der Entwicklung des Features erforderlich sind. Diese Artikel werden veröffentlicht, bis die vorgeschlagenen Spezifikationsänderungen abgeschlossen und in die aktuelle ECMA-Spezifikation aufgenommen werden.
Es kann einige Abweichungen zwischen der Featurespezifikation und der abgeschlossenen Implementierung geben. Diese Unterschiede werden in den relevanten Anmerkungen zum Language Design Meeting (LDM) erfasst.
Weitere Informationen zum Prozess für die Aufnahme von Funktions-Speclets in den C#-Sprachstandard finden Sie im Artikel zu den Spezifikationen.
Zusammenfassung
Lassen Sie nameof(parameter)
innerhalb eines Attributs für eine Methode oder einen Parameter zu.
Zum Beispiel:
[MyAttribute(nameof(parameter))] void M(int parameter) { }
[MyAttribute(nameof(TParameter))] void M<TParameter>() { }
void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }
Motivation
Attribute wie NotNullWhen
oder CallerExpression
müssen auf Parameter verweisen. Diese Parameter liegen derzeit jedoch außerhalb des Bereichs.
Detailliertes Design
Die type_parameters der Methode befinden sich im Bereich der method_declaration und können verwendet werden, um in diesem Bereich Typen in return_type, method_body und type_parameter_constraints_clauses zu formen, jedoch nicht in Attributen, ausgenommen innerhalb eines nameof
Ausdrucks in einem Attribut.
Eine Methodendeklaration erstellt einen separaten Deklarationsraum für Parameter, Typparameter und lokale Variablen. Namen werden in diesen Deklarationsbereich durch die Typparameterliste und die formale Parameterliste der Methode und durch lokale Variablendeklarationen im Block der Methode eingeführt.
Namen werden in diesen Deklarationsabschnitt entsprechend der Typparameterliste und der formalen Parameterliste der Methode in nameof
-Ausdrücken in Attributen eingeführt, die der Methode oder ihren Parametern zugeordnet sind.
[...]
Innerhalb eines Methodenblocks können formale Parameter nach ihren Bezeichnern in simple_name-Ausdrücken (einfachen Namen) referenziert werden.
Innerhalb eines nameof
-Ausdrucks in Attributen, die der Methode oder ihren Parametern zugeordnet sind, kann auf formale Parameter nach ihren Bezeichnern in simple_name-Ausdrücken verwiesen werden.
Der Geltungsbereich der Parameter der anonymen Funktion sind anonymous_function_body (§7.7) und nameof
-Ausdrücke in Attributen, die der anonymen Funktion oder ihren Parametern zugeordnet sind.
Der Geltungsbereich der Parameter des Delegaten sind nameof
-Ausdrücke in Attributen, die der Deklaration, ihren Typparametern oder ihren Parametern zugeordnet sind.
Ein simple_name hat entweder das Format I
oder das Format I<A1,...,Ak>
, wobei I
ein einzelner Bezeichner und <A1,...,Ak>
eine optionale type_argument_list ist. Wenn keine type_argument_list angegeben wird, wird K
als 0 betrachtet. Der simple_name wird wie folgt bewertet und klassifiziert:
- Wenn
K
Null ist, simple_name in einem Block enthalten ist und der Deklarationsabschnitt der lokalen Variablen des Blocks (oder eines umschließenden Blocks) eine lokale Variable, einen Parameter oder eine Konstante mit dem NamenI
enthält, verweist simple_name auf diese lokale Variable, diesen Parameter oder diese Konstante und wird als Variable oder Wert klassifiziert. - Wenn
K
null ist und der simple_name im Textkörper einer generischen Methodendeklaration erscheint und wenn diese Deklaration einen Typparameter mit dem NamenI
enthält, dann verweist der simple_name auf diesen Typparameter. - Wenn
K
Null ist, simple_name in einemnameof
-Ausdruck in einem Attribut der Methodendeklaration oder ihrer Parameter enthalten ist und diese Deklaration einen Parameter oder Typparameter mit dem NamenI
enthält, dann verweist simple_name auf diesen Parameter oder Typparameter. - Andernfalls gilt für jeden Instanztyp
T
(der Instanztyp), vom Instanztyp der unmittelbar umschließenden Typdeklaration bis zum Instanztyp jeder umschließenden Klasse oder Strukturdeklaration (wenn zutreffend):
[...] - Andernfalls werden für jeden Namespace
N
ab dem Namespace, in dem simple_name enthalten ist, über jeden umschließenden Namespace (wenn zutreffend) bis zum globalen Namespace die folgenden Schritte ausgewertet, bis eine Entität gefunden wird:
[...] - Andernfalls ist die simple_name nicht definiert, und ein Kompilierungszeitfehler tritt auf.
- Der Bereich eines Typparameters, der durch type_parameter_list in einer method_declaration deklariert wird, sind [...] sowie
nameof
-Ausdrücke in einem Attribut der Methodendeklaration oder ihrer Parameter. - Der Bereich eines in method_declaration (Methoden) deklarierten Parameters sind der method_body dieser method_declaration sowie die
nameof
-Ausdrücke in einem Attribut der method declaration oder ihrer Parameter.
Zugehörige Spezifikationsabschnitte
C# feature specifications