Ambito nameof
esteso
Nota
Questo articolo è una specifica di funzionalità. La specifica funge da documento di progettazione per la funzionalità. Include le modifiche specifiche proposte, insieme alle informazioni necessarie durante la progettazione e lo sviluppo della funzionalità. Questi articoli vengono pubblicati fino a quando le modifiche specifiche proposte non vengono completate e incorporate nella specifica ECMA corrente.
Potrebbero verificarsi alcune discrepanze tra la specifica di funzionalità e l'implementazione completata. Tali differenze vengono acquisite nelle note pertinenti del language design meeting (LDM) .
Altre informazioni sul processo per adottare le specifiche nello standard del linguaggio C# sono disponibili nell'articolo sulle specifiche di .
Sommario
Consenti nameof(parameter)
all'interno di un attributo su un metodo o un parametro.
Per esempio:
[MyAttribute(nameof(parameter))] void M(int parameter) { }
[MyAttribute(nameof(TParameter))] void M<TParameter>() { }
void M(int parameter, [MyAttribute(nameof(parameter))] int other) { }
Motivazione
Gli attributi come NotNullWhen
o CallerExpression
devono fare riferimento ai parametri, ma questi parametri non sono attualmente inclusi nell'ambito.
Progettazione dettagliata
I type_parameters del metodo sono inclusi nell'ambito di tutto il method_declaratione possono essere usati per formare i tipi in tale ambito in return_type, method_bodye type_parameter_constraints_clauses, ma non negli attributi , tranne all'interno di un'espressione nameof
negli attributi .
Una dichiarazione di metodo crea uno spazio di dichiarazione separato per parametri, parametri di tipo e variabili locali. I nomi vengono introdotti in questo spazio di dichiarazione dall'elenco dei parametri di tipo e dall'elenco di parametri formali del metodo e dalle dichiarazioni di variabili locali nel blocco del metodo .
Nomi vengono introdotti in questo spazio di dichiarazione dall'elenco dei parametri di tipo e dall'elenco dei parametri formali del metodo nelle espressioni nameof
negli attributi inseriti nel metodo o nei relativi parametri.
[...]
All'interno del blocco di un metodo, è possibile fare riferimento ai parametri formali tramite i relativi identificatori nelle espressioni simple_name (nomi semplici).
All'interno di un'espressione nameof
negli attributi inseriti nel metodo o nei relativi parametri, è possibile fare riferimento ai parametri formali tramite i relativi identificatori nelle espressioni simple_name.
L'ambito dei parametri della funzione anonima è il corpo della funzione anonima (§7.7), con le espressioni e nameof
negli attributi posti sulla funzione anonima o sui relativi parametri.
L'ambito dei parametri del delegato è nameof
espressioni negli attributi inseriti nella dichiarazione, nei suoi parametri di tipo o nei suoi parametri.
Un simple_name è nella forma I
oppure nella forma I<A1,...,Ak>
, dove I
è un singolo identificatore e <A1,...,Ak>
è un type_argument_listfacoltativo. Quando non viene specificato alcun type_argument_list, considerare K
essere zero. Il simple_name viene valutato e classificato come segue:
- Se
K
è zero e il simple_name viene visualizzato all'interno di un blocco e se lo spazio di dichiarazione della variabile locale (o di un blocco di inclusione) contiene una variabile locale, un parametro o una costante con nomeI
, il simple_name fa riferimento a tale variabile locale, parametro o costante e viene classificato come variabile o valore. - Se
K
è zero e il simple_name viene visualizzato all'interno del corpo di una dichiarazione di metodo generico e se tale dichiarazione include un parametro di tipo con nomeI
, il simple_name fa riferimento a tale parametro di tipo. -
Se
K
è zero e il simple_name viene visualizzato all'interno di un'espressionenameof
in un attributo nella dichiarazione del metodo o nei relativi parametri e se tale dichiarazione include un parametro o un parametro di tipo con nomeI
, il simple_name fa riferimento a tale parametro o parametro di tipo. - In caso contrario, per ogni tipo di istanza
T
(tipo di istanza), a partire dal tipo di istanza della dichiarazione di tipo immediatamente racchiuso e continuando con il tipo di istanza di ogni dichiarazione di classe o struct di inclusione (se presente):
[...] - In caso contrario, per ogni spazio dei nomi
N
, a partire dallo spazio dei nomi in cui si verifica il simple_name, continuando con ogni spazio dei nomi racchiuso (se presente) e terminando con lo spazio dei nomi globale, i passaggi seguenti vengono valutati fino a quando non viene individuata un'entità:
[...] - In caso contrario, il simple_name non è definito e si verifica un errore in fase di compilazione.
ambiti di
- L'ambito di un parametro di tipo dichiarato da un elenco_parametri_tipo in una dichiarazione_metodo è [...] e
nameof
espressioni in un attributo nella dichiarazione del metodo o nei suoi parametri. - L'ambito di un parametro dichiarato in un method_declaration (Metodi) è il method_body di tale method_declaration e
nameof
espressioni in un attributo nella dichiarazione del metodo o nei relativi parametri.
Sezioni specifiche correlate
C# feature specifications