Rozšířený rozsah nameof
Poznámka
Tento článek je specifikace funkce. Specifikace slouží jako návrhový dokument pro funkci. Zahrnuje navrhované změny specifikace spolu s informacemi potřebnými při návrhu a vývoji funkce. Tyto články se publikují, dokud nebudou navrhované změny specifikace finalizovány a začleněny do aktuální specifikace ECMA.
Mezi specifikací funkce a dokončenou implementací může docházet k nějakým nesrovnalostem. Tyto rozdíly jsou zachyceny v příslušných poznámkách ze schůzky návrhu jazyka (LDM).
Další informace o procesu přijetí specifikací funkcí do jazyka C# najdete v článku o specifikacích .
Problém šampiona: https://github.com/dotnet/csharplang/issues/373
Shrnutí
Povolte nameof(parameter)
jako atribut u metody nebo parametru.
Například:
[MyAttribute(nameof(parameter))] void M(int parameter) { }
[MyAttribute(nameof(TParameter))] void M<TParameter>() { }
void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }
Motivace
Atributy, jako jsou NotNullWhen
nebo CallerExpression
, musí odkazovat na parametry, ale tyto parametry aktuálně nejsou v oboru.
Podrobný návrh
type_parameters metody jsou v oboru v celém method_declarationa lze ho použít k formování typů v celém oboru v return_type, method_bodya type_parameter_constraints_clauses, ale ne v atributech , s výjimkou výrazu nameof
v atributech .
Deklarace metody vytvoří samostatný prostor deklarace pro parametry, parametry typu a místní proměnné. Názvy se do tohoto prostoru deklarací zavádějí seznamem parametrů typu a formálním seznamem parametrů metody a deklaracemi místních proměnných v bloku metody.
Názvy se do tohoto prostoru deklarací zavádějí seznamem parametrů typu a formálním seznamem parametrů metody ve výrazech nameof
v atributech umístěných na metodě nebo jeho parametrech.
[...]
V rámci bloku metody lze formální parametry odkazovat pomocí jejich identifikátorů ve výrazech simple_name (jednoduché názvy).
V rámci výrazu nameof
v atributech umístěných na metodě nebo jejích parametrech lze formální parametry odkazovat pomocí jejich identifikátorů ve výrazech simple_name.
Rozsahem parametrů anonymní funkce je anonymous_function_body (§7.7), výrazy a nameof
v atributech umístěných na anonymní funkci nebo jejích parametrech.
Rozsah parametrů delegáta je nameof
výrazy v atributech umístěných na deklaraci, jeho typech parametrů nebo jeho parametrech.
simple_name je buď I
podoby, nebo I<A1,...,Ak>
podoby, kde I
je jeden identifikátor a <A1,...,Ak>
je volitelný type_argument_list. Pokud není zadán žádný type_argument_list, uveďte K
jako nulu.
simple_name se vyhodnotí a klasifikuje takto:
- Pokud je
K
nula a simple_name se zobrazí v bloku a pokud místní prostor deklarace proměnné (deklarace) bloku (nebo nadřazeného bloku) obsahuje místní proměnnou, parametr nebo konstantu s názvemI
, pak simple_name odkazuje na tuto místní proměnnou, parametr nebo konstantu a je klasifikována jako proměnná nebo hodnota. - Pokud je
K
nula a simple_name se zobrazí v těle deklarace obecné metody a pokud tato deklarace obsahuje parametr typu s názvemI
, simple_name odkazuje na tento parametr typu. -
Pokud je
K
nula a simple_name se zobrazí ve výrazunameof
v atributu deklarace metody nebo jeho parametrů a pokud tato deklarace obsahuje parametr nebo typ parametru s názvemI
, pak simple_name odkazuje na tento parametr nebo parametr typu. - Jinak platí, že pro každý typ instance
T
(typ instance), počínaje typem instance bezprostředně uzavřenou deklarací typu a pokračováním s typem instance každé nadřazené třídy nebo deklarace struktury (pokud existuje):
[...] - Jinak platí, že pro každý obor názvů
N
počínaje oborem názvů, ve kterém dojde k simple_name, pokračujeme s každým uzavřeným oborem názvů (pokud existuje) a končícím globálním oborem názvů, následující kroky se vyhodnocují, dokud se nenachází entita:
[...] - V opačném případě je simple_name nedefinovaný a dojde k chybě v době kompilace.
- Rozsah typu parametru, který je deklarován seznamem parametrů typu na deklaraci metody, zahrnuje [...] a
nameof
výrazy v atributu na deklaraci metody nebo jejích parametrů. - Rozsah parametru deklarovaného v method_declaration (Methods) je method_body tohoto method_declaration a
nameof
výrazů v atributu deklarace metody nebo jeho parametrů.
Související oddíly specifikace
C# feature specifications