Quel est le type concret de ce ienumerable
private IEnumerable<string> GetIEnumerable()
{
yield return "a";
yield return "a";
yield return "a";
}
3 Réponses :
C'est un type généré par le compilateur. Le compilateur génère un Le code généré a l'air quelque chose em> comme ceci *: p> ou peut-être, comme le dit Slaks dans sa réponse, le Deux implémentations se retrouvent dans la même classe. J'ai écrit ceci en fonction de ma mémoire agitée de code généré que j'avais examiné auparavant; Vraiment, une classe suffirait, car il n'ya aucune raison que la fonctionnalité ci-dessus nécessite deux. p> En fait, viennent y penser, les deux implémentations vraiment devraient em> tomber dans une seule classe , comme je viens de me souvenir des fonctions qui utilisent des instructions code> de rendement code> doivent avoir un type de retour em> Quoi qu'il en soit, je vous laisse effectuer les corrections de code sur ce que j'ai affiché mentalement. P> * Ceci est purement à des fins d'illustration; Je ne fais aucune réclamation quant à sa réelle précision. Il est que de démontrer de manière générale comment le compilateur fait ce qu'il fait, sur la base des preuves que j'ai constatées dans mes propres enquêtes. SUB> P> P> ienumerator
ienumerable
getenumerator < / code> méthode.
ienumerable
ienumerator
De plus, le type généré par le compilateur aura le nom
<< / code> et
> code> fait partie du nom type i>. Vous ne pouvez pas écrire un tel nom de type dans C #, mais c'est valable Dans le CLRR.) Le type est imbriqué à l'intérieur du type qui déclare la méthode
getienumerable () code>.
Le compilateur générera automatiquement une classe qui implémente à la fois ienumerable
ienumerator
Veuillez ajouter les parties pertinentes du lien à votre réponse
La mise en œuvre concrète de impressions: p> ienumerable
YourClass+<GetIEnumerable>d__0
Ceci est un sucre syntaxique. Beaucoup se passe sous le capot. Le moyen plus rapide de la voir est d'utiliser le réflecteur. Il crée fondamentalement une classe qui conserve un état et renvoie "A" lorsque
getNext () code> ou quelque chose comme ça s'appelle.
@Timwi merci pour la modification :)