Partage via


Erreurs et avertissements lors de l’utilisation d’expressions lambda et de fonctions anonymes

Plusieurs erreurs concernent la déclaration et l’utilisation d’expressions lambda et de méthodes anonymes :

  • CS0407 : 'method' a le type de retour incorrect.
  • CS0428 : Impossible de convertir le groupe de méthodes 'Identificateur' en type 'type' non délégué. Avez-vous l’intention d’appeler la méthode ?
  • CS0748 : Utilisation incohérente des paramètres lambda ; les types de paramètres doivent être explicites ou implicites.
  • CS0815 : Impossible d’affecter 'expression' à une variable implicitement typée.
  • CS0828 : Impossible d’affecter 'expression' à la propriété de type anonyme.
  • CS0837 : Le premier opérande d’un opérateur « is » ou « as » peut ne pas être une expression lambda, une méthode anonyme ou un groupe de méthodes.
  • CS1065 : Les valeurs par défaut ne sont pas valides dans ce contexte.
  • CS1621 : L’instruction yield ne peut pas être utilisée à l’intérieur d’une méthode anonyme ou d’une expression lambda.
  • CS1628 : Impossible d’utiliser ou de paramètre à l’intérieur d’une méthode anonyme, d’une expression lambda ou d’une expression de requête.
  • CS1632 : Le contrôle ne peut pas laisser le corps d’une méthode anonyme ou d’une expression lambda.
  • CS1643 : Tous les chemins de code ne retournent pas une valeur dans la méthode anonyme de type « type ».
  • CS1660 : Impossible de convertir l’expression lambda en type 'type', car il ne s’agit pas d’un type délégué.
  • CS1661 : Impossible de convertir le bloc de méthode anonyme en type « type », car les types de paramètres ne correspondent pas aux types de paramètres délégués.
  • CS1662 : Impossible de convertir le bloc de méthode anonyme en type délégué prévu, car certains des types de retour du bloc ne sont pas implicitement convertibles en type de retour délégué.
  • CS1673 : Les méthodes anonymes, les expressions lambda et les expressions de requête à l’intérieur des structs ne peuvent pas accéder aux membres d’instance de « this ».
  • CS1676 : Le paramètre 'number' doit être déclaré avec le mot clé 'keyword'.
  • CS1677 : Le paramètre 'number' ne doit pas être déclaré avec le mot clé 'keyword'.
  • CS1678 : Le paramètre 'number' est déclaré comme type 'type1', mais doit être 'type2'.
  • CS1686 : Variable locale ou ses membres ne peuvent pas avoir leur adresse prise et être utilisées à l’intérieur d’une méthode anonyme ou d’une expression lambda.
  • CS1688 : Impossible de convertir le bloc de méthode anonyme sans liste de paramètres en « délégué », car il a un ou plusieurs paramètres sortants.
  • CS1706 : L’expression ne peut pas contenir de méthodes anonymes ou d’expressions lambda.
  • CS1731 : Impossible de convertir l’expression en délégué, car certains des types de retour dans le bloc ne sont pas implicitement convertibles en type de retour délégué.
  • CS1732 : paramètre attendu.
  • CS1764 : Impossible d’utiliser un local fixe à l’intérieur d’une méthode anonyme, d’une expression lambda ou d’une expression de requête.
  • CS8030 : La fonction anonyme convertie en délégué de retour void ne peut pas retourner une valeur.
  • CS8175 : Impossible d’utiliser ref local à l’intérieur d’une méthode anonyme, d’une expression lambda ou d’une expression de requête.
  • CS8820 : une fonction anonyme statique ne peut pas contenir de référence à « variable ».
  • CS8821 : une fonction anonyme statique ne peut pas contenir de référence à « this » ou « base ».
  • CS8916 : Les attributs des expressions lambda nécessitent une liste de paramètres entre parenthèses.
  • CS8917 : Le type délégué n’a pas pu être déduit.
  • CS8934 : Impossible de convertir la méthode anonyme en type 'type', car le type de retour ne correspond pas au type de retour délégué.
  • CS8975 : Le mot clé contextuel ne peut pas être utilisé comme type de retour lambda explicite.
  • CS9098 : Paramètre lambda implicitement typé '...' ne peut pas avoir de valeur par défaut.

En outre, plusieurs avertissements concernent la déclaration et l’utilisation d’expressions lambda :

  • CS0467 : Ambiguïté entre la méthode 'method' et l'élément 'non-method' qui n'est pas une méthode. Utilisation du groupe de méthodes.
  • CS1911 : L’accès au membre via un mot clé « base » à partir d’une méthode anonyme, d’une expression lambda, d’une expression de requête ou d’un itérateur entraîne un code non vérifiable.
  • CS8971 : InterpolatedStringHandlerArgument n’a aucun effet lorsqu’il est appliqué aux paramètres lambda et sera ignoré sur le site d’appel.
  • CS8974 : Conversion du groupe de méthodes 'method' en type 'type' non délégué. Avez-vous l’intention d’appeler la méthode ?
  • CS9099 : la valeur de paramètre par défaut ne correspond pas au type de délégué cible.
  • CS9100 : Le paramètre a un modificateur params en lambda, mais pas dans le type de délégué cible.

Le compilateur produit également le message d’information suivant :

  • CS9236 : La compilation nécessite la liaison de l’expression lambda un certain nombre de fois. Envisagez de déclarer l’expression lambda avec des types de paramètres explicites, ou si l'appel de la méthode contenant est générique, envisagez d’utiliser des arguments de type explicites.

Limitations de syntaxe dans les expressions lambda

  • CS0837 : Le premier opérande d’un ou d’un opérateur peut ne pas être une expression lambda, une méthode anonyme ou un groupe de méthodes.
  • CS1621 : L’instruction ne peut pas être utilisée à l’intérieur d’une méthode anonyme ou d’une expression lambda.
  • CS1628 : Impossible d’utiliser , ou de paramètre à l’intérieur d’une méthode anonyme, d’une expression lambda ou d’une expression de requête.
  • CS1632 : Le contrôle ne peut pas sortir du corps d’une méthode anonyme ou d’une expression lambda.
  • CS1673 : Les méthodes anonymes, les expressions lambda et les expressions de requête à l’intérieur des structs ne peuvent pas accéder aux membres d’instance de .
  • CS1686 : Variable locale ou ses membres ne peuvent pas avoir leur adresse prise et être utilisées à l’intérieur d’une méthode anonyme ou d’une expression lambda.
  • CS1706 : L’expression ne peut pas contenir de méthodes anonymes ou d’expressions lambda.
  • CS1764 : Impossible d’utiliser un local fixe à l’intérieur d’une méthode anonyme, d’une expression lambda ou d’une expression de requête.
  • CS1911 : Avertissement : l’accès au membre via un mot clé « base » à partir d’une méthode anonyme, d’une expression lambda, d’une expression de requête ou d’un itérateur entraîne un code non vérifiable.
  • CS8175 : Impossible d’utiliser ref local à l’intérieur d’une méthode anonyme, d’une expression lambda ou d’une expression de requête.
  • CS8820 : une fonction anonyme statique ne peut pas contenir de référence à « variable ».
  • CS8821 : une fonction anonyme statique ne peut pas contenir de référence à « this » ou « base ».
  • CS8971 : Avertissement : InterpolatedStringHandlerArgument n’a aucun effet lorsqu’il est appliqué aux paramètres lambda et est ignoré sur le site d’appel.
  • CS9236 : Informational : La compilation nécessite la liaison de l’expression lambda au moins un certain nombre de fois. Envisagez de déclarer l’expression lambda avec des types de paramètres explicites, ou si l’appel de la méthode qui contient est générique, envisagez d’utiliser des arguments de type explicites.

Le compilateur interdit certaines constructions C# à l’intérieur d’expressions lambda et de méthodes anonymes. Ces restrictions existent, car le compilateur transforme des méthodes lambda et anonymes en appels délégués ou arborescences d’expressions, et certaines constructions ne peuvent pas être représentées dans ces formulaires. Pour plus d’informations, consultez la section expressions de fonction anonyme de la spécification C#.

Vous pouvez corriger ces erreurs à l’aide des instructions suivantes :

  • Déplacez une ou une instruction hors du corps lambda et dans la méthode itérateur englobante, ou convertissez le lambda en fonction locale, qui prend en charge les instructions (CS1621).
  • Évitez de référencer , ou les paramètres de la méthode englobante à l’intérieur du corps lambda. Lorsque l’expression lambda capture ces paramètres dans le cadre d’une fermeture, la sémantique de référence des paramètres similaires ne peut pas être conservée. Copiez la valeur dans une variable locale et utilisez cette variable locale à la place, ou convertissez l’lambda en fonction locale (CS1628).
  • Supprimez n’importe quel , ou instruction qui transfère le contrôle hors du corps lambda. Les instructions de flux de contrôle doivent cibler des étiquettes ou des boucles dans le même corps lambda (CS1632).
  • Dans un type, évitez de référencer les membres d’instance à l’intérieur d’une expression lambda, d’une méthode anonyme ou d’une expression de requête. Étant donné que le compilateur capture par valeur dans un , les mutations à l’intérieur de l’lambda n’affectent pas l’instance d’origine. Extrayez les valeurs de membre nécessaires dans des variables locales avant le lambda, ou convertissez en une fonction locale, qui peut accéder directement (CS1673).
  • Il est déconseillé de prendre l’adresse d’une variable locale que le lambda capture également. Le compilateur déplace les variables capturées vers un objet de fermeture alloué au tas, ce qui rend leur adresse instable. Séparez la logique de prise d’adresses de l’lambda ou utilisez plutôt une fonction locale (CS1686).
  • Déplacez l’expression lambda ou la méthode anonyme hors de l’expression contenante qui l’interdit. Certaines expressions, telles que les constructeurs d’attributs, ne prennent pas en charge les expressions lambda ou les méthodes anonymes en tant qu’arguments (CS1706).
  • N’utilisez pas de variable locale à l’intérieur d’un corps lambda. La garantie d’épinglage de la déclaration s’applique uniquement à la portée englobante, et non à la fermeture générée par le compilateur (CS1764).
  • N’utilisez pas de variable locale à l’intérieur d’un corps lambda. Comme les paramètres, les variables locales ne peuvent pas être capturées dans la fermeture générée par le compilateur pour l’expression lambda. Affectez la valeur à une variable non locale ou convertissez l’lambda en fonction locale (CS8175).
  • N’utilisez pas d’expression lambda, de méthode anonyme ou de groupe de méthodes comme premier opérande de l’opérateur. Ces constructions n’ont pas de type qui peut être testé au moment de l’exécution. Affectez d’abord l’expression à une variable, puis testez la variable (CS0837).
  • Supprimez le modificateur de l’expression lambda ou supprimez la référence à la variable capturée. Une lambda interdit explicitement la capture de variables locales ou de paramètres pour éviter des allocations de clôture involontaires. Si vous devez référencer des variables externes, supprimez le modificateur. Si vous souhaitez conserver l’allocation de tas minimale, transmettez les valeurs en tant que paramètres à l’lambda (CS8820, CS8821).
  • Supprimez le paramètre lambda ou déplacez la logique vers une méthode où l’attribut est respecté. Le compilateur ignore cet attribut sur les paramètres lambda, car les appels lambda n'utilisent pas le même gestionnaire de chaîne interpolée lors de la transformation que les appels de méthode standard (CS8971).
  • Évitez d’appeler un membre virtuel via le mot clé à l’intérieur d’une méthode lambda ou anonyme. Le compilateur génère un appel non virtuel via une méthode d’assistance, qui produit du code non vérifiable. Pensez à extraire l'appel dans une méthode distincte et à appeler cette méthode à partir de la fonction lambda à la place (CS1911).
  • Réduisez la complexité des appels de méthode surchargés qui acceptent des expressions lambda ou ajoutent des informations de type explicites. Lorsque le compilateur doit lier une expression lambda plusieurs fois pour résoudre les surcharges, il émet ce diagnostic informationnel. La déclaration de l’lambda avec des types de paramètres explicites ou la fourniture d’arguments de type explicites sur l’appel de méthode générique réduit le nombre de liaisons que le compilateur doit effectuer (CS9236).

Paramètres d’expression lambda et retours

  • CS0748 : Utilisation incohérente des paramètres lambda ; les types de paramètres doivent être explicites ou implicites.
  • CS1065 : Les valeurs par défaut ne sont pas valides dans ce contexte.
  • CS1643 : Tous les chemins de code ne retournent pas une valeur dans la méthode anonyme de type « type ».
  • CS1661 : Impossible de convertir le bloc de méthode anonyme en type « type », car les types de paramètres ne correspondent pas aux types de paramètres délégués.
  • CS1662 : Impossible de convertir le bloc de méthode anonyme en type délégué prévu, car certains des types de retour du bloc ne sont pas implicitement convertibles en type de retour délégué.
  • CS1676 : Le paramètre 'number' doit être déclaré avec le mot clé 'keyword'.
  • CS1677 : Le paramètre 'number' ne doit pas être déclaré avec le mot clé 'keyword'.
  • CS1678 : Le paramètre 'number' est déclaré comme type 'type1', mais doit être 'type2'.
  • CS1688 : Impossible de convertir le bloc de méthode anonyme sans liste de paramètres en « délégué », car il a un ou plusieurs paramètres sortants.
  • CS1731 : Impossible de convertir l’expression en délégué, car certains des types de retour dans le bloc ne sont pas implicitement convertibles en type de retour délégué.
  • CS1732 : paramètre attendu.
  • CS8030 : La fonction anonyme convertie en délégué de retour void ne peut pas retourner une valeur.
  • CS8916 : Les attributs des expressions lambda nécessitent une liste de paramètres entre parenthèses.
  • CS8934 : Impossible de convertir la méthode anonyme en type 'type', car le type de retour ne correspond pas au type de retour délégué.
  • CS8975 : Le mot clé contextuel 'var' ne peut pas être utilisé comme type de retour lambda explicite.
  • CS9098 : Paramètre lambda implicitement typé '...' ne peut pas avoir de valeur par défaut.

Ces erreurs indiquent un problème avec un paramètre d’expression lambda ou une déclaration de type de retour. Pour connaître les règles complètes sur les types de paramètres lambda et de retour, consultez les expressions lambda, les méthodes anonymes et la section expressions de fonction anonyme de la spécification C#.

Note

CS1731 et CS1732 ne sont plus produits par la version actuelle du compilateur C# (Roslyn). Ils peuvent apparaître si vous utilisez une version antérieure du compilateur.

Vous pouvez corriger ces erreurs à l’aide des instructions suivantes :

  • Vérifiez que tous les paramètres d’une expression lambda utilisent le même style de saisie. Lorsqu'une expression lambda a plusieurs paramètres, chaque paramètre doit être typé explicitement ou implicitement, il est impossible de combiner les deux styles dans une seule et même liste de paramètres (CS0748).
  • Ajoutez des types explicites à n’importe quel paramètre lambda qui a une valeur par défaut. Le compilateur requiert des types explicites sur les paramètres par défaut, car il doit générer un type délégué personnalisé qui encode la valeur par défaut. Les paramètres implicitement typés ne fournissent pas suffisamment d’informations pour que le compilateur construise ce type de délégué (CS1065, CS9098).
  • Supprimez les valeurs de paramètre par défaut des méthodes anonymes déclarées à l’aide de l’opérateur. Les valeurs de paramètre par défaut sont prises en charge uniquement dans les expressions lambda, et non dans les méthodes anonymes. Convertissez la méthode anonyme en expression lambda si vous avez besoin de valeurs par défaut (CS1065).
  • Mettre en correspondance les types de paramètres, les modificateurs et le nombre de paramètres de la méthode lambda ou anonyme au type délégué cible. Le compilateur effectue une correspondance exacte des signatures de paramètres lors de la conversion d’une fonction anonyme en délégué : chaque paramètre doit avoir le type correct, et n’importe quel , ou modificateur doit être présent exactement quand le délégué l’attend (CS1661, CS1676, CS1677, CS1678).
  • Ajoutez une liste de paramètres à la méthode anonyme lorsque le type de délégué cible a des paramètres. Une méthode anonyme déclarée sans liste de paramètres (à l’aide de la syntaxe) peut correspondre à la plupart des types délégués, mais le compilateur ne peut pas synthétiser implicitement les paramètres requis . Déclarez explicitement les paramètres pour qu’ils correspondent à la signature de délégué (CS1688).
  • Vérifiez que tous les chemins de code de la méthode lambda ou anonyme retournent une valeur lorsque le type délégué cible a un type de retour non void. Chaque branche du corps doit produire une valeur de retour implicitement convertible en type de retour du délégué (CS1643, CS1662, CS1731, CS8934).
  • Supprimez toute instruction avec une valeur d’une méthode lambda ou anonyme affectée à un type délégué -return tel que . Étant donné que le type de retour du délégué est , le corps ne peut pas retourner de valeur (CS8030).
  • Placez la liste de paramètres entre parenthèses lorsque les attributs sont appliqués à n’importe quel paramètre lambda. Le compilateur a besoin du formulaire entre parenthèses pour distinguer la syntaxe d’attribut d’autres expressions. Par exemple, écrivez plutôt que (CS8916).
  • Utilisez un nom de type spécifique au lieu du type de retour explicite d’une expression lambda. Le mot clé est réservé aux variables locales implicitement typées et ne peut pas être utilisé comme annotation de type de retour lambda. Spécifiez le type de retour réel ou omettez le type de retour et laissez le compilateur le déduire (CS8975).
  • Corrigez la liste des paramètres afin que le compilateur puisse le reconnaître comme une déclaration de paramètre valide. Cette erreur indique une liste de paramètres incorrecte où le compilateur attendait un identificateur de paramètre, mais qu’il a trouvé autre chose (CS1732).

Type de délégué d’expression lambda

  • CS0407 : 'method' a le type de retour incorrect.
  • CS0428 : Impossible de convertir le groupe de méthodes 'Identificateur' en type 'type' non délégué. Avez-vous l’intention d’appeler la méthode ?
  • CS0467 : Avertissement : Ambiguïté entre la méthode 'method' et la non-méthode 'non-method'. Utilisation du groupe de méthodes.
  • CS0815 : Impossible d’affecter 'expression' à une variable implicitement typée.
  • CS0828 : Impossible d’affecter 'expression' à la propriété de type anonyme.
  • CS1660 : Impossible de convertir l’expression lambda en type 'type', car il ne s’agit pas d’un type délégué.
  • CS8917 : Le type délégué n’a pas pu être déduit.
  • CS8974 : Avertissement : Conversion du groupe de méthodes 'method' en type 'type' non délégué. Avez-vous l’intention d’appeler la méthode ?
  • CS9099 : Avertissement : la valeur du paramètre par défaut ne correspond pas au type de délégué cible.
  • CS9100 : Avertissement : Le paramètre a un modificateur params en lambda, mais pas dans le type de délégué cible.

Ces erreurs indiquent un problème avec le type délégué que le compilateur déduit ou attend pour une expression lambda, une méthode anonyme ou un groupe de méthodes. Pour consulter les règles complètes relatives aux conversions de délégués, reportez-vous aux expressions lambda, aux méthodes anonymes, et à la section sur les expressions de fonction anonymes de la spécification C#.

Note

La version actuelle du compilateur C# (Roslyn) ne produit pas CS0467. Cette erreur peut s’afficher si vous utilisez une version antérieure du compilateur.

Vous pouvez corriger ces erreurs à l’aide des instructions suivantes :

  • Vérifiez que le type cible de l’affectation ou de la conversion est un type délégué ou . Une expression lambda ou une méthode anonyme ne peut pas être affectée à un type non délégué tel qu’une interface. Remplacez le type de la variable par un type délégué compatible tel ou , ou utilisez-le pour permettre au compilateur de déduire le type délégué (CS1660).
  • Fournissez suffisamment de contexte pour le compilateur afin de déterminer un type délégué unique pour l’expression lambda. Lorsqu’il est affecté, le compilateur a besoin d’un type de retour et d’une liste de paramètres non ambigus. Lorsqu’il est affecté à une propriété de type anonyme, le compilateur ne peut pas déduire du tout un type délégué. Affectez l’lambda à une variable avec un type délégué explicite, puis utilisez cette variable dans l’initialiseur de type anonyme (CS0815, CS0828, CS8917).
  • Mettre en correspondance le type de retour du groupe de méthodes au type de retour déclaré du délégué. Une conversion de groupe de méthodes nécessite que le type de retour de la méthode soit convertible par identité ou implicitement convertible en le type de retour du délégué. Modifiez le type de retour de la méthode ou modifiez le type de délégué pour qu'il soit compatible (CS0407).
  • Appelez la méthode au lieu d’affecter le groupe de méthodes lorsque le type cible n’est pas un délégué. Si le type cible est , ou un autre type non délégué, vous avez probablement l’intention d’appeler la méthode et d’affecter son résultat. Ajoutez des parenthèses et des arguments pour appeler la méthode (CS0428, CS8974).
  • Résolvez l’ambiguïté entre une méthode et un membre non-méthode qui partagent le même nom. Renommez l’un des membres en conflit ou utilisez une référence complète pour supprimer l’ambiguïté (CS0467).
  • Supprimez la valeur ou le modificateur de paramètre par défaut de l’expression lambda lorsque le type de délégué cible est standard ou type. Les valeurs et les modificateurs par défaut entraînent le compilateur à générer un type délégué personnalisé qui ne correspond pas ou . Utilisez pour permettre au compilateur de synthétiser le type de délégué correct, ou de supprimer la valeur ou le modificateur par défaut afin que l’expression lambda corresponde au type délégué déclaré (CS9099, CS9100).