Risolvere gli errori e gli avvisi correlati alle funzioni locali

Questo articolo illustra gli errori e gli avvisi del compilatore seguenti:

  • CS8108: Impossibile passare un argomento di tipo dinamico al parametro params 'parameter' della funzione locale 'method'.
  • CS8112: la funzione locale 'method' deve dichiarare un corpo perché non è contrassegnato come 'static extern'.
  • CS8321: la funzione locale 'method' viene dichiarata ma mai usata
  • CS8421: una funzione locale statica non può contenere un riferimento a 'variable'.
  • CS8422: una funzione locale statica non può contenere un riferimento a 'this' o 'base'.

Le funzioni locali sono state aggiunte in C# 7.0. Consentono di dichiarare metodi di supporto all'interno di un altro membro. La diagnostica in questo articolo illustra le dichiarazioni di funzioni locali, le chiamate, l'utilizzo e le restrizioni di acquisizione aggiuntive per static le funzioni locali.

Corpi delle funzioni locali

  • CS8112: la funzione locale 'method' deve dichiarare un corpo perché non è contrassegnato come 'static extern'.

Una dichiarazione di funzione locale deve includere un corpo a meno che la funzione locale non sia dichiarata static extern. Aggiungi un corpo di blocco o un corpo di espressione alla funzione locale. Se l'implementazione viene fornita esternamente, contrassegnare la funzione static extern locale e assicurarsi che la dichiarazione segua le regole per i metodi esterni.

Parametri params e argomenti dinamici

  • CS8108: impossibile passare l'argomento con tipo dinamico al parametro 'parameter' della funzione locale 'method'.

Una chiamata di funzione locale non può passare un dynamic argomento a un params parametro. Convertire il valore nel tipo di elemento o nel tipo di matrice previsto dal params parametro prima della chiamata. È anche possibile archiviare i valori in una matrice tipizzata in modo esplicito e passare tale matrice alla funzione locale.

Funzioni locali inutilizzate

  • CS8321: la funzione locale 'method' viene dichiarata ma mai usata

Il compilatore segnala questo avviso quando si dichiara una funzione locale ma nessun codice raggiungibile la chiama. Rimuovere la funzione locale inutilizzata o chiamarla dal membro che la contiene. Se si intende usare la funzione locale in una modifica futura, mantenerla fuori dall'origine fino a quando non è necessaria.

Le funzioni locali statiche non possono acquisire lo stato

  • CS8421: una funzione locale statica non può contenere un riferimento a 'variable'.
  • CS8422: una funzione locale statica non può contenere un riferimento a 'this' o 'base'.

Una static funzione locale non può acquisire lo stato dall'ambito di inclusione. Non può fare riferimento, tramite this, a variabili locali del contesto esterno, parametri, membri dell'istanza oppure a this stesso. Passare ogni valore necessario per la funzione locale come parametro (CS8421, CS8422). Se la funzione locale deve accedere a variabili o allo stato dell'istanza dall'ambito esterno, rimuovere il modificatore static.

L'esempio seguente mostra i riferimenti che causano CS8422:

public class C
{
    private int counter = 1;

    public void IncreaseCounter()
    {
        static void LocalFunc(int addition)
        {
            this.counter += addition;   // CS8422
            base.ToString();            // CS8422

            counter += addition;        // CS8422: implicit this
            ToString();                 // CS8422: implicit base
        }

        LocalFunc(10);
    }
}

Per correggere CS8422, passare i dati dell'istanza necessari alla funzione locale, spostare l'helper all'esterno del contesto dell'istanza o rimuovere static quando la funzione locale deve accedere allo stato dell'istanza.