Condividi tramite


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

Metodi

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 .

parametri del metodo

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.

Prototipi di funzioni anonime

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.

dichiarazioni delegate

L'ambito dei parametri del delegato è nameof espressioni negli attributi inseriti nella dichiarazione, nei suoi parametri di tipo o nei suoi parametri.

nomi semplici

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 nome I, 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 nome I, il simple_name fa riferimento a tale parametro di tipo.
  • Se K è zero e il simple_name viene visualizzato all'interno di un'espressione nameof in un attributo nella dichiarazione del metodo o nei relativi parametri e se tale dichiarazione include un parametro o un parametro di tipo con nome I, 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.