Partage via


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 éventuellement yield break) ne peut pas également utiliser une instruction return 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 par ref. 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 clause catch ou finally.
  • Vous ne pouvez pas yield return depuis un bloc try avec une clause catch.
  • Vous ne pouvez pas yield return depuis un bloc unsafe. Le contexte pour un itérateur crée un bloc safe imbriqué dans le bloc unsafe 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.