Dela via


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

metoder

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.

metod parametrar

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.

anonyma funktionssignaturer

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.

Delegatdeklarationer

Omfånget för ombudets parametrar är nameof uttryck i attribut som placeras i deklarationen, dess typparametrar eller dess parametrar.

Enkla namn

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 namnet I, 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 namnet Irefererar simple_name till den typparametern.
  • Om K är noll och simple_name visas inom ett nameof uttryck i ett attribut på metoddeklarationen eller dess parametrar och om deklarationen innehåller en parameter eller typparameter med namnet Irefererar 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ång

  • 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.