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

Il existe plusieurs erreurs liées à la déclaration et à l’utilisation d’expressions lambda :

  • CS0748 : Utilisation du paramètre lambda incohérente ; les types de paramètres doivent être tous explicites ou tous implicites.
  • CS1621 : L’instruction yield ne peut pas être utilisée dans une méthode anonyme ou une expression lambda.
  • CS1628 : Impossible d’utiliser le paramètre in, ref ou out dans une méthode anonyme, une expression lambda ou une expression de requête.
  • CS1632 : Le contrôle ne peut pas quitter le 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 dans des structs ne peuvent pas accéder aux membres d’instance de 'ceci'.
  • CS1686 : L’adresse d’une variable locale ou de ses membres ne peut pas être prise, ni utilisée dans une méthode anonyme ou une expression lambda.
  • CS1706 : Une expression ne peut pas contenir de méthodes anonymes ou d’expressions lambda.
  • CS8030 : Une fonction anonyme convertie en délégué ayant un type de retour void ne peut pas retourner de valeur.
  • CS8175 : Impossible d’utiliser une variable locale avec ref dans une méthode anonyme, une expression lambda ou une expression de requête.
  • CS8916 : Les attributs sur les expressions lambda nécessitent une liste de paramètres entre parenthèses.
  • CS8971 : InterpolatedStringHandlerArgument n’a aucun effet quand il est appliqué aux paramètres lambda. Il est ignoré sur le site d’appel.
  • CS8975 : Le mot clé contextuel var ne peut pas être utilisé en tant que type de retour lambda explicite.
  • CS9098 : Le paramètre lambda implicitement typé '...' ne peut pas avoir de valeur par défaut.

De plus, il existe plusieurs avertissements liés à la déclaration et à l’utilisation d’expressions lambda :

  • CS8971 : InterpolatedStringHandlerArgument n’a aucun effet quand il est appliqué aux paramètres lambda. Il est ignoré sur le site d’appel.
  • CS9099 : La valeur de paramètre par défaut ne correspond pas à la valeur attendue dans le type délégué cible.
  • CS9100 : Le paramètre a le modificateur params dans l’expression lambda mais pas dans le type délégué cible.

Limitations de syntaxe dans les expressions lambda

Une partie de la syntaxe C# est interdite dans les expressions lambda et les méthodes anonymes. L’utilisation de constructions non valides dans une expression lambda provoque les erreurs suivantes :

  • CS1621 : L’instruction yield ne peut pas être utilisée dans une méthode anonyme ou une expression lambda.
  • CS1628 : Impossible d’utiliser le paramètre in, ref ou out dans une méthode anonyme, une expression lambda ou une expression de requête.
  • CS1632 : Le contrôle ne peut pas quitter le 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 dans des structs ne peuvent pas accéder aux membres d’instance de this.
  • CS1686 : L’adresse d’une variable locale ou de ses membres ne peut pas être prise, ni utilisée dans une méthode anonyme ou une expression lambda.
  • CS8175 : Impossible d’utiliser une variable locale avec ref dans une méthode anonyme, une expression lambda ou une expression de requête.

Toutes les constructions suivantes sont interdites dans les expressions lambda :

  • Instructions yield (yield return ou yield break)
  • Appel d’une méthode qui a un paramètre in, ref ou out
  • Variables locales avec ref
  • Instructions break, goto et continue
  • Accès à this quand this est un type struct
  • Méthodes anonymes ou expressions lambda à l’intérieur d’une autre expression, par exemple un constructeur d’attribut.

Vous ne pouvez utiliser aucune de ces constructions dans une expression lambda ou une méthode anonyme. Un grand nombre d’entre eux sont autorisés dans une fonction locale.

De plus, les types de gestionnaire de chaînes interpolées sont ignorés quand ils sont appliqués à un paramètre lambda. Si vous en utilisez un, l’avertissement suivant s’affiche :

  • CS8971 : InterpolatedStringHandlerArgument n’a aucun effet quand il est appliqué aux paramètres lambda. Il est ignoré sur le site d’appel.

Paramètres et retours d’expression lambda

Les erreurs suivantes indiquent un problème lié à une déclaration de paramètre :

  • CS0748 : Utilisation du paramètre lambda incohérente ; les types de paramètres doivent être tous explicites ou tous implicites.
  • CS9098 : Le paramètre lambda implicitement typé '...' ne peut pas avoir de valeur par défaut.
  • CS8030 : Une fonction anonyme convertie en délégué ayant un type de retour void ne peut pas retourner de valeur.
  • CS8916 : Les attributs sur les expressions lambda nécessitent une liste de paramètres entre parenthèses.
  • CS8975 : Le mot clé contextuel 'var' ne peut pas être utilisé en tant que type de retour lambda explicite.

Les paramètres d’expression lambda doivent suivre les règles suivantes :

  • Quand une expression lambda a plusieurs paramètres, tous les paramètres doivent être explicitement typés, ou tous les paramètres doivent être implicitement typés.
  • Tous les paramètres lambda ayant une valeur par défaut doivent être explicitement typés.
  • Si des attributs sont appliqués à des paramètres, la liste de paramètres doit être placée entre parenthèses.

Les types de retour d’expression lambda doivent suivre les règles suivantes :

  • Une expression lambda qui retourne une valeur ne peut pas être convertie en délégué ayant un type de retour void, par exemple Action.
  • Le type de retour est un type déduit ou explicite. Un type de retour déclaré à l’aide du mot clé var n’est pas autorisé.

Type délégué d’expression lambda

  • CS9099 : Avertissement : La valeur de paramètre par défaut ne correspond pas à la valeur attendue dans le type délégué cible.

Quand vous déclarez une valeur par défaut ou ajoutez le modificateur params avec un paramètre d’expression lambda, le type délégué n’est pas l’un des types Func ou Action. Il s’agit plutôt d’un type personnalisé qui inclut la valeur de paramètre par défaut ou le modificateur params. Le code suivant génère des avertissements, car il affecte une expression lambda ayant un paramètre par défaut à un type Action :

Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };

Si vous souhaitez corriger l’erreur, supprimez le paramètre par défaut ou utilisez une variable implicitement typée pour le type délégué :

Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };