Erreurs et avertissements liés à l’instruction yield return
et aux méthodes itérateurs
Il existe de nombreuses erreurs liées à l’instruction yield return
et aux méthodes itérateurs :
- CS1622 : Impossible de renvoyer une valeur depuis un itérateur. Utilisez l’instruction yield return pour renvoyer une valeur, ou yield break pour terminer l’itération.
- CS1624 : Le corps de « accessor » ne peut pas être un bloc itérateur car « type » n’est pas un type d’interface d’itérateur
- CS1625: Impossible de générer dans le corps d’une clause finally
- CS1626: Impossible de générer une valeur dans le corps d’un bloc try avec une clause catch
- CS1627: Expression attendue après yield return
- CS1629: Du code unsafe ne peut pas s’afficher dans des itérateurs
- CS1631: Impossible de générer une valeur dans le corps d’une clause catch
- CS1637: Les itérateurs ne peuvent pas avoir de paramètres unsafe ou de types yield
- CS4013: Impossible d’utiliser une instance de type dans une fonction imbriquée, une expression de requête, un bloc itérateur ou une méthode async
- CS8154: Le corps ne peut pas être un bloc itérateur, car il effectue un retour par référence
- CS8176: Les itérateurs ne peuvent pas avoir de variables locales par référence
- CS9238 : Impossible d’utiliser « yield return » dans un bloc « unsafe »
- CS9239 : L’opérateur
&
ne peut pas être utilisé sur des paramètres ou des variables locales dans les méthodes itérateurs.
Structure d’une méthode itérateur
Une méthode itérateur doit respecter plusieurs règles en C#. Le compilateur génère les erreurs suivantes lorsque votre méthode itérateur enfreint une ou plusieurs de ces règles :
- CS1622 : Impossible de renvoyer une valeur depuis un itérateur. Utilisez l’instruction yield return pour renvoyer une valeur, ou yield break pour terminer l’itération.
- CS1624 : Le corps de « accessor » ne peut pas être un bloc itérateur car « type » n’est pas un type d’interface d’itérateur
- CS1627: Expression attendue après yield return
- CS1637: Les itérateurs ne peuvent pas avoir de paramètres unsafe ou de types yield
- CS8154: Le corps ne peut pas être un bloc itérateur, car il effectue un retour par référence
Votre méthode itérateur doit respecter les règles suivantes :
- Une méthode itérateur (utilisant
yield return
et éventuellementyield break
) ne peut pas également utiliser une instructionreturn
pour renvoyer une séquence. - Une méthode itérateur doit déclarer un type d’interface itérateur comme type de retour. Les types d’interface itérateur sont : IEnumerable, IEnumerable<T>, IEnumerator, IEnumerator<T>.
- Une instruction
yield return
doit inclure une expression à renvoyer dans le cadre d’une séquence.yield return;
n’est pas valide. - Une méthode itérateur ne peut pas utiliser de types non sécurisés comme paramètres, tels que des pointeurs.
- Une méthode itérateur ne peut pas
yield return
un type non sécurisé, tel que des pointeurs. - Une méthode itérateur ne peut pas
yield return
parref
. Vous devez renvoyer par valeur.
Restrictions sur les méthodes itérateurs
Le corps d’une méthode itérateur doit respecter les restrictions sur l’instruction yield return
et son contexte. Le compilateur génère les erreurs suivantes lorsque votre itérateur enfreint l’une de ces restrictions :
- CS1625: Impossible de générer dans le corps d’une clause finally
- CS1626: Impossible de générer une valeur dans le corps d’un bloc try avec une clause catch
- CS1631: Impossible de générer une valeur dans le corps d’une clause catch
- CS1629: Du code unsafe ne peut pas s’afficher dans des itérateurs
- CS9238 : Impossible d’utiliser « yield return » dans un bloc « unsafe »
- CS9239 : L’opérateur
&
ne peut pas être utilisé sur des paramètres ou des variables locales dans les méthodes itérateurs.
Ces erreurs indiquent que votre code enfreint les règles de sécurité parce qu’un itérateur renvoie un élément et reprend pour générer l’élément suivant :
- Vous ne pouvez pas
yield return
depuis une clausecatch
oufinally
. - Vous ne pouvez pas
yield return
depuis un bloctry
avec une clause catch. - Vous ne pouvez pas
yield return
depuis un blocunsafe
. Le contexte pour un itérateur crée un blocsafe
imbriqué dans le blocunsafe
englobant. - Vous ne pouvez pas utiliser l’opérateur
&
pour prendre l’adresse d’une variable dans une méthode itérateur.
Avant C# 13, les itérateurs ne pouvaient pas contenir de code unsafe
(CS1629). À partir de C# 13, cette restriction est assouplie. Toutes les instructions yield return
doivent se trouver dans un contexte sécurisé, mais une méthode itérateur peut contenir du code unsafe
.
sécurité ref dans les méthodes itérateurs
Les méthodes itérateurs ont des restrictions spéciales de sécurité ref. Ces règles sont assouplies dans C# 13 :
- CS4013 : Impossible d’utiliser une instance de type dans une fonction imbriquée, une expression de requête, un bloc itérateur ou une méthode async
- CS8176 : Les itérateurs ne peuvent pas avoir de variables locales par référence
Avant C# 13, les itérateurs ne pouvaient pas déclarer de variables locales ref
. Ils ne pouvaient déclarer aucune variable de type ref struct
.
À compter de C# 13, les types ref struct
peuvent être utilisés dans les méthodes d’itérateur s’ils ne font pas l’objet d’un accès via une instruction yield return
. À partir de C# 13, les méthodes itérateurs peuvent déclarer des variables locales ref
.