Sdílet prostřednictvím


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

metody

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 .

parametry metody

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.

podpisy anonymních funkcí

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.

deklarace delegátů

Rozsah parametrů delegáta je nameof výrazy v atributech umístěných na deklaraci, jeho typech parametrů nebo jeho parametrech.

Jednoduché názvy

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ázvem I, 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ázvem I, simple_name odkazuje na tento parametr typu.
  • Pokud je K nula a simple_name se zobrazí ve výrazu nameof v atributu deklarace metody nebo jeho parametrů a pokud tato deklarace obsahuje parametr nebo typ parametru s názvem I, 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ů Npočí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.

obory

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