IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

yield return et liste générique ?


Sujet :

C#

  1. #1
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut yield return et liste générique ?
    Bon, je sais pas si c'est parce qu'il est tard mais j'avoue ne plus avoir d'idées sur pourquoi ce code fonctionne bien (normal jusque là):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public IEnumerable<int> MethodWithIEnumerable()
            {
                foreach (int i in list)
                {
                    yield return i;
                }
            }
    Alors que celui-ci ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public List<int> MethodWithList()
            {
                foreach (int i in list)
                {
                    yield return i;
                }
            }

    Je reçois le message d'erreur suivant:

    Error 1 The body of 'TestYield.Program.MethodWithList()' cannot be an iterator block because 'System.Collections.Generic.List<int>' is not an iterator interface type

    Alors que pourtant, List<T> implémente bien IEnumerable et IEnumerable<T>...



    Une idée




  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je sens que je vais avoir du mal à m'exprimer

    Je pense que c'est une limitation du langage/compilateur qui n'est pas prévu pour utiliser yield sur un type implémentant une interface enumérateur, mais uniquement sur une interface en elle-même.
    Cela doit sans doute être pour simplifier le code CIL généré pour le foreach...
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Le type de retour d'un itérateur doit être IEnumerable, IEnumerator, IEnumerable<T> ou IEnumerator<T>.

    L'explication se trouve au début de cet article mais j'ai pas tout pigé. Faudra que je le relise plus tard.
    http://msdn.microsoft.com/msdnmag/is...lt.aspx?loc=fr
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    Il faut comprendre ce que fait le compilateur C# qd tu utilises l'instruction yield return : il génère une classe avec un nom aléatoire genre d__0 qui dérive de IEnumerable<int>, IEnumerable, IEnumerator<int>, IEnumerator, IDisposable. Il modifie aussi ta méthode MethodWithIEnumerable() pour renvoyer cette nouvelle classe. Donc au final rien de magique dans le yield return, simplement le compilateur génère pour toi la plomberie qu'il fallait manuellement effectuer avant (écrire la classe qui dérive de IEnumerable<int> et écrire la classe qui dérive de IEnumerator<int>).

    Maintenant ton problème qd tu essayes de renvoyer un List<int> est plus clair : le compilateur va renvoyer depuis ta méthode un objet de type d__0 (nom généré aléatoirement je le rappelle) qui dérive de IEnumerable<int> , mais pas de List<int> !
    Tu écris :

    Alors que pourtant, List<T> implémente bien IEnumerable et IEnumerable<T>...
    Mais c'est l'inverse qui est demandé, pour que ça fonctionne il faudrait que IEnumerable<T> dérive de List<T>, tu vois ?

    Si mon explication n'est pas encore assez claire, un seul conseil, décompile ton code avec reflector, tu verras tout ce que fait le compilateur dans ton dos .

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut



    Bon, je vais creuser ca: merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liste générique de types génériques
    Par le2tbomi dans le forum VB.NET
    Réponses: 7
    Dernier message: 17/07/2008, 23h16
  2. Comment utiliser les listes génériques ?
    Par nicoletflo dans le forum C#
    Réponses: 8
    Dernier message: 09/04/2008, 14h34
  3. Sélection d'un champ d'une liste générique ?
    Par chuiben dans le forum Ada
    Réponses: 2
    Dernier message: 22/03/2007, 14h36
  4. "yield return" en VB
    Par Matthieu MEZIL dans le forum VB.NET
    Réponses: 3
    Dernier message: 06/02/2007, 13h58
  5. Réponses: 12
    Dernier message: 23/09/2006, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo