Udostępnij za pośrednictwem


Rozszerzony zakres nameof

Notatka

Ten artykuł jest specyfikacją funkcji. Specyfikacja służy jako dokument projektowy dla funkcji. Zawiera proponowane zmiany specyfikacji wraz z informacjami wymaganymi podczas projektowania i opracowywania funkcji. Te artykuły są publikowane do momentu sfinalizowania proponowanych zmian specyfikacji i włączenia ich do obecnej specyfikacji ECMA.

Mogą wystąpić pewne rozbieżności między specyfikacją funkcji a ukończoną implementacją. Te różnice są przechwytywane w odpowiednich spotkania projektowego języka (LDM).

Więcej informacji na temat procesu wdrażania specyfikacji funkcji można znaleźć w standardzie języka C# w artykule dotyczącym specyfikacji .

Streszczenie

Zezwalaj na nameof(parameter) wewnątrz atrybutu metody lub parametru. Na przykład:

  • [MyAttribute(nameof(parameter))] void M(int parameter) { }
  • [MyAttribute(nameof(TParameter))] void M<TParameter>() { }
  • void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }

Motywacja

Atrybuty takie jak NotNullWhen lub CallerExpression muszą odwoływać się do parametrów, ale te parametry nie są obecnie w zakresie.

Szczegółowy projekt

metody

Parametry typu metody znajdują się w zakresie w deklaracji metodyi mogą być używane do tworzenia typów w tym zakresie w typie zwracanym, ciele metodyi klauzulach ograniczeń parametrów typu, ale nie w atrybutach, z wyjątkiem wyrażenia nameof w atrybutach.

Parametry metody

Deklaracja metody tworzy oddzielną przestrzeń deklaracji dla parametrów, parametrów typu i zmiennych lokalnych. Nazwy są wprowadzane do tej przestrzeni deklaracji przez listę parametrów typu oraz formalną listę parametrów metody i deklaracje zmiennych lokalnych w bloku metody. Nazwy są wprowadzane do tej przestrzeni deklaracji przez listę parametrów typu i formalną listę parametrów metody w wyrażeniach nameof w atrybutach umieszczonych w metodzie lub jej parametrach.

[...]
W bloku metody parametry formalne mogą być przywoływane przez ich identyfikatory w wyrażeniach simple_name (proste nazwy). W wyrażeniu nameof w atrybutach umieszczonych w metodzie lub jej parametrach parametry formalne mogą być przywoływane przez ich identyfikatory w wyrażeniach simple_name.

Sygnatury funkcji anonimowych

Zakres parametrów funkcji anonimowej obejmuje ciało funkcji anonimowej (§7.7) oraz wyrażenia i nameof w atrybutach umieszczonych na funkcji anonimowej lub jej parametrach.

Deleguj deklaracje

Zakres parametrów delegata to nameof wyrażenia w atrybutach zamieszczonych w deklaracji, jego parametrach typu lub parametrach.

Proste nazwy

simple_name jest albo I wzoru, albo I<A1,...,Ak>wzoru, gdzie I jest pojedynczym identyfikatorem, a <A1,...,Ak> jest opcjonalną listą_argumentów_typu. Jeśli nie określono type_argument_list, należy uznać K za zero. simple_name jest oceniany i klasyfikowany w następujący sposób:

  • Jeśli K wynosi zero, a simple_name pojawia się w bloku i jeśli blok (lub blok otaczający) obszar deklaracji zmiennych lokalnych (Deklaracje) zawiera zmienną lokalną, parametr lub stałą o nazwie I, to simple_name odnosi się do tej zmiennej lokalnej, parametru lub stałej i jest klasyfikowane jako zmienna lub wartość.
  • Jeśli K ma wartość zero, a simple_name pojawia się w treści deklaracji metody ogólnej, a jeśli ta deklaracja zawiera parametr typu o nazwie I, simple_name odnosi się do tego parametru typu.
  • Jeśli K ma wartość zero, a simple_name pojawia się w nameof w wyrażeniu w atrybucie w deklaracji metody lub jego parametrach, a jeśli ta deklaracja zawiera parametr lub parametr typu o nazwie I, simple_name odnosi się do tego parametru lub parametru typu.
  • W przeciwnym razie dla każdego typu wystąpienia T (typ wystąpienia), począwszy od typu wystąpienia deklaracji typu bezpośrednio otaczającej i kontynuując od typu wystąpienia każdej otaczającej klasy lub struktury (jeśli istnieje):
    [...]
  • W przeciwnym razie dla każdej przestrzeni nazw N, począwszy od przestrzeni nazw, w której występuje simple_name, kontynuując każdą otaczającą przestrzeń nazw (jeśli istnieje), a kończąc na globalnej przestrzeni nazw, następujące kroki są oceniane do momentu zlokalizowania jednostki:
    [...]
  • W przeciwnym razie simple_name nie jest zdefiniowany i występuje błąd w czasie kompilacji.

zakresów

  • Zakres parametru typu zadeklarowanego przez type_parameter_list w method_declaration to [...] i nameof wyrażenia w atrybucie deklaracji metody lub jego parametrów.
  • Zakres parametru zadeklarowanego w deklaracji_metody (Metody) to ciało_metody tej deklaracji_metody i nameof w wyrażeniach w atrybucie przy deklaracji metody lub jej parametrów.