Résoudre les erreurs et les avertissements liés aux fonctions locales

Cet article traite des erreurs et des avertissements suivants du compilateur :

  • CS8108 : Impossible de passer l’argument avec un type dynamique au paramètre params 'parameter' de la fonction locale 'method'.
  • CS8112 : la fonction locale 'method' doit déclarer un corps, car il n’est pas marqué 'static extern'.
  • CS8321 : La fonction locale 'method' est déclarée mais jamais utilisée
  • CS8421 : une fonction locale statique ne peut pas contenir de référence à « variable ».
  • CS8422 : une fonction locale statique ne peut pas contenir de référence à « this » ou « base ».

Les fonctions locales ont été ajoutées dans C# 7.0. Ils vous permettent de déclarer des méthodes utilitaires au sein d’un autre membre. Les diagnostics présentés dans cet article couvrent les déclarations de fonctions locales, les appels, leur utilisation et les restrictions supplémentaires en matière de capture pour les fonctions locales static.

Corps de fonction local

  • CS8112 : la fonction locale 'method' doit déclarer un corps, car il n’est pas marqué 'static extern'.

Une déclaration de fonction locale doit inclure un corps, sauf si la fonction locale est déclarée static extern. Ajoutez un corps de bloc ou un corps d’expression à la fonction locale. Si l’implémentation est fournie en externe, marquez la fonction static extern locale et vérifiez que la déclaration suit les règles des méthodes externes.

Paramètres « params » et arguments dynamiques

  • CS8108 : Impossible de passer l’argument avec un type dynamique au paramètre params 'parameter' de la fonction locale 'method'.

Un appel de fonction local ne peut pas passer un dynamic argument à un params paramètre. Convertissez la valeur en type d’élément ou type de tableau attendu par le params paramètre avant l’appel. Vous pouvez également stocker les valeurs dans un tableau typé explicitement et passer ce tableau à la fonction locale.

Fonctions locales inutilisées

  • CS8321 : La fonction locale 'method' est déclarée mais jamais utilisée

Le compilateur signale cet avertissement lorsque vous déclarez une fonction locale, mais qu’aucun code accessible ne l’appelle. Supprimez la fonction locale inutilisée ou appelez-la du membre englobant. Si vous envisagez d’utiliser la fonction locale dans une modification ultérieure, conservez-la hors de la source jusqu’à ce qu’elle soit nécessaire.

Les fonctions locales statiques ne peuvent pas capturer l’état

  • CS8421 : une fonction locale statique ne peut pas contenir de référence à « variable ».
  • CS8422 : une fonction locale statique ne peut pas contenir de référence à « this » ou « base ».

Une static fonction locale ne peut pas capturer l’état à partir de l’étendue englobante. Il ne peut pas faire référence à des variables locales, à des paramètres ni à des membres d’instance de la portée englobante via this, ni à this lui-même. Transmettez chaque valeur dont la fonction locale a besoin en tant que paramètre (CS8421, CS8422). Si la fonction locale doit capturer des variables ou un état d’instance de l’étendue englobante, supprimez le static modificateur.

L’exemple suivant montre les références qui provoquent l’erreur 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);
    }
}

Pour corriger CS8422, transmettez les données d’instance requises à la fonction locale, déplacez l’assistance en dehors du contexte de l’instance ou supprimez static lorsque la fonction locale doit accéder à l’état de l’instance.