Partager 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 inref ou out 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é var 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 la non-méthode 'non-method'. 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 opérateur is ou as ne peut pas être une expression lambda, une méthode anonyme ou un groupe de méthodes.
  • 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 in, refou out 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 this.
  • 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 : à titre d'information : 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 explicitement définis, ou si l'appel de la méthode contenant 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 yield return ou yield break instruction hors du corps lambda et dans la méthode itérateur englobante, ou convertissez l'expression lambda en une fonction locale, qui prend en charge les instructions yield (CS1621).
  • Évitez de référencer in, refou out 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 refparamè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 break, gotoou continue 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 struct type, évitez de référer aux membres d’instance par this à 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 this par valeur dans un struct, les mutations à l’intérieur de l’lambda n’affectent pas l’instance d’origine. Extrayez les valeurs de membre nécessaires en variables locales avant l’lambda, ou convertissez en fonction locale, qui peut accéder this 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 fixed variable locale à l’intérieur d’un corps lambda. La garantie d’épinglage de l’instruction fixed s’applique uniquement à la portée englobante, et non à la fonction de fermeture générée par le compilateur (CS1764).
  • N’utilisez pas de ref local à l’intérieur d’un corps lambda. Comme ref les paramètres, ref 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 nonref locale ou convertissez l’lambda en fonction locale (CS8175).
  • N’utilisez pas une expression lambda, une méthode anonyme ou un groupe de méthodes comme premier opérande des opérateurs is ou as. 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 static modificateur de l’expression lambda ou supprimez la référence à la variable capturée. Une static expression lambda interdit explicitement la capture de variables locales, de paramètres ou this d’éviter les allocations de fermeture involontaires. Si vous devez référencer des variables externes, supprimez le static modificateur. Si vous souhaitez conserver l’allocation de tas minimale, transmettez les valeurs comme paramètres à la lambda (CS8820, CS8821).
  • Supprimez le InterpolatedStringHandlerArgumentAttribute 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înes interpolées que les appels de méthode standard (CS8971).
  • Évitez d’appeler un membre virtuel via le mot clé base à 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. Envisagez d’extraire l’appel base dans une méthode distincte et d’appeler cette méthode à partir de l’expression 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’un lambda a plusieurs paramètres, chaque paramètre doit être typé explicitement ou implicitement typé , vous ne pouvez pas combiner les deux styles dans la 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 delegate. 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, ref/out/inles 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 ref, outou in 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 out des paramètres. Une méthode anonyme déclarée sans liste de paramètres (à l’aide delegate { } 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 out . 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 return avec une valeur provenant d'une méthode lambda ou anonyme assignée à un type de délégué retournant void, tel que Action. Étant donné que le type de retour du délégué est void, 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 ([MyAttribute] int x) => x plutôt que [MyAttribute] x => x (CS8916).
  • Utilisez un nom de type spécifique au lieu du var type de retour explicite d’une expression lambda. Le mot clé var 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 possède un modificateur params dans le 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 connaître les règles complètes sur les conversions de délégués, consultez les expressions lambda, les méthodes anonymes et la section expressions de fonction anonyme 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 System.Linq.Expressions.Expression. Une expression lambda ou une méthode anonyme ne peut pas être affectée à un type non délégué tel qu’une object interface. Remplacez le type de la variable par un type délégué compatible tel Func<> ou Action<>, ou utilisez-le var 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é à var, 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 d’identité ou implicitement convertible en type de retour du délégué. Modifiez le type de retour de la méthode ou modifiez le type délégué en correspondance (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 string, intou 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 de paramètre par défaut ou le params modificateur de l’expression lambda lorsque le type de délégué cible est un type Func<> ou Action<> standard. Les valeurs par défaut et les modificateurs params amènent le compilateur à générer un type de délégué personnalisé qui ne correspond à Func<> ni à Action<>. Utilisez var pour permettre au compilateur de synthétiser le type de délégué correct, ou de supprimer la valeur ou params le modificateur par défaut afin que l’expression lambda corresponde au type délégué déclaré (CS9099, CS9100).