Partager via


Erreurs et avertissements lors de 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 incohérente des paramètres lambda ; les types de paramètres doivent être explicites ou implicites.
  • 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.
  • 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.
  • 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.
  • CS8916 : Les attributs des expressions lambda nécessitent une liste de paramètres entre parenthèses.
  • CS8971 : InterpolatedStringHandlerArgument n’a aucun effet lorsqu’il est appliqué aux paramètres lambda et sera ignoré sur le site d’appel.
  • 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, il existe plusieurs avertissements liés à la déclaration et à l’utilisation d’expressions lambda :

  • CS8971 : InterpolatedStringHandlerArgument n’a aucun effet lorsqu’il est appliqué aux paramètres lambda et sera ignoré sur le site d’appel.
  • 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

Certaines syntaxes C# sont interdites 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 à 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.
  • 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.

Toutes les constructions suivantes sont interdites dans les expressions lambda :

  • yield déclarations (yield return ou yield break)
  • Appel d’une méthode qui a un in, refou out un paramètre
  • ref variables locales
  • instructions break, gotoet continue
  • this accès lorsqu'il this est de type struct
  • Méthodes anonymes ou expressions lambda à l’intérieur d’une autre expression, comme un constructeur d’attributs.

Vous ne pouvez utiliser aucune de ces constructions dans une expression lambda ou une méthode anonyme. Beaucoup sont autorisés dans une fonction locale.

En outre, les types de gestionnaires de chaînes interpolés sont ignorés lorsqu’ils sont appliqués à un paramètre lambda. Si vous en utilisez un, vous voyez l’avertissement suivant :

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

Certaines expressions amènent le compilateur à émettre l'avertissement informatif suivant :

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

La complexité des expressions lambda et la façon dont elles appellent d’autres expressions lambda a un impact négatif sur les performances du compilateur. La raison est que le compilateur doit déduire des types de paramètres et d’arguments par le biais des expressions lambda et que les types potentiels prennent du temps.

Paramètres d’expression lambda et retours

Ces erreurs indiquent un problème avec une déclaration de paramètre :

  • CS0748 : Utilisation incohérente des paramètres lambda ; les types de paramètres doivent être explicites ou implicites.
  • CS9098 : Paramètre lambda implicitement typé '...' ne peut pas avoir de valeur par défaut.
  • 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.
  • CS8975 : Le mot clé contextuel 'var' ne peut pas être utilisé comme type de retour lambda explicite.

Les paramètres d’expression lambda doivent respecter ces règles :

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

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

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

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

  • CS9099 : Avertissement : la valeur du paramètre par défaut ne correspond pas au type de délégué cible.

Lorsque 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 parmi les 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 qui a un paramètre par défaut à un Action type :

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

Pour 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) => { };