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
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.
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.
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.
Zakres parametrów delegata to nameof
wyrażenia w atrybutach zamieszczonych w deklaracji, jego parametrach typu lub parametrach.
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 nazwieI
, 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 nazwieI
, simple_name odnosi się do tego parametru typu. -
Jeśli
K
ma wartość zero, a simple_name pojawia się wnameof
w wyrażeniu w atrybucie w deklaracji metody lub jego parametrach, a jeśli ta deklaracja zawiera parametr lub parametr typu o nazwieI
, 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 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.
Powiązane sekcje specyfikacji
C# feature specifications