Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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
inrefououtde 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é
varcontextuel 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
yieldne peut pas être utilisée à l’intérieur d’une méthode anonyme ou d’une expression lambda. -
CS1628 : Impossible d’utiliser
in,refououtde 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 :
-
yielddéclarations (yield returnouyield break) - Appel d’une méthode qui a un
in,refououtun paramètre -
refvariables locales - instructions
break,gotoetcontinue -
thisaccès lorsqu'ilthisest de typestruct - 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é
varn’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) => { };