Utökat nameof
omfång
Not
Den här artikeln är en funktionsspecifikation. Specifikationen fungerar som designdokument för funktionen. Den innehåller föreslagna specifikationsändringar, tillsammans med information som behövs under utformningen och utvecklingen av funktionen. Dessa artiklar publiceras tills de föreslagna specifikationsändringarna har slutförts och införlivats i den aktuella ECMA-specifikationen.
Det kan finnas vissa skillnader mellan funktionsspecifikationen och den slutförda implementeringen. Dessa skillnader finns dokumenterade i de relevanta anteckningarna från språkdesignmötet (LDM).
Du kan läsa mer om processen för att införa funktionsspecifikationer i C#-språkstandarden i artikeln om specifikationerna.
Champion-problem: https://github.com/dotnet/csharplang/issues/373
Sammanfattning
Tillåt nameof(parameter)
inuti ett attribut på en metod eller parameter.
Till exempel:
[MyAttribute(nameof(parameter))] void M(int parameter) { }
[MyAttribute(nameof(TParameter))] void M<TParameter>() { }
void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }
Motivation
Attribut som NotNullWhen
eller CallerExpression
behöver referera till parametrar, men dessa parametrar finns för närvarande inte i omfånget.
Detaljerad design
Metodens type_parameters finns i omfånget i hela method_declarationoch kan användas för att skapa typer i omfånget i return_type, method_bodyoch type_parameter_constraints_clauses men inte i attribut, förutom i ett nameof
uttryck i attribut.
En metoddeklaration skapar ett separat deklarationsutrymme för parametrar, typparametrar och lokala variabler. Namn introduceras i det här deklarationsutrymmet av typparameterlistan och den formella parameterlistan för metoden och av lokala variabeldeklarationer i metodens block.
Namn introduceras i det här deklarationsutrymmet av typparameterlistan och den formella parameterlistan för metoden i nameof
uttryck i attribut som placeras på metoden eller dess parametrar.
[...]
Inom en metods block kan formella parametrar refereras till med sina identifierare i simple_name-uttryck ("simple names").
Inom ett nameof
uttryck i attribut som placeras på metoden eller dess parametrar kan formella parametrar refereras till med sina identifierare i simple_name uttryck.
Omfånget för parametrarna för den anonyma funktionen är anonymous_function_body (§7.7) och nameof
uttryck i attribut som placeras på den anonyma funktionen eller dess parametrar.
Omfånget för ombudets parametrar är nameof
uttryck i attribut som placeras i deklarationen, dess typparametrar eller dess parametrar.
En simple_name har antingen formen I
eller formen I<A1,...,Ak>
, där I
är en enda identifierare och <A1,...,Ak>
är en valfri type_argument_list. När inga type_argument_list har angetts bör du överväga att K
vara noll.
simple_name utvärderas och klassificeras på följande sätt:
- Om
K
är noll och simple_name visas inom ett block och om blockets (eller ett omslutande block) lokala variabeldeklarationsutrymme (deklarationer) innehåller en lokal variabel, parameter eller konstant med namnetI
, refererar simple_name till den lokala variabeln, parametern eller konstanten och klassificeras som en variabel eller ett värde. - Om
K
är noll och simple_name visas i brödtexten i en allmän metoddeklaration och om den deklarationen innehåller en typparameter med namnetI
refererar simple_name till den typparametern. -
Om
K
är noll och simple_name visas inom ettnameof
uttryck i ett attribut på metoddeklarationen eller dess parametrar och om deklarationen innehåller en parameter eller typparameter med namnetI
refererar simple_name till parametern eller typparametern. - Annars, för varje typinstans
T
(Typinstansen), som börjar med typinstansen för den omedelbart omslutande typdeklarationen och fortsätter med typinstansen för varje omslutande klass- eller struktdeklaration (om någon):
[...] - I annat fall utvärderas följande steg tills en entitet finns för varje namnområde
N
, från och med namnområdet där simple_name inträffar, fortsätter med varje omslutande namnområde (om det finns) och slutar med det globala namnområdet:
[...] - Annars är simple_name odefinierat och ett kompileringsfel inträffar.
- Omfånget för en typparameter som deklareras av en type_parameter_list på en method_declaration är [...] och
nameof
uttryck i ett attribut på metoddeklarationen eller dess parametrar. - Omfånget för en parameter som deklareras i en method_declaration (metoder) är method_body för method_declaration och
nameof
uttryck i ett attribut på metoddeklarationen eller dess parametrar.
Relaterade specifikationsavsnitt
C# feature specifications