IEnumerable fournit deux méthodes de GetEnumerator - quelle est la différence entre eux?
-
05-09-2019 - |
Question
Quand j'emplement interface IEnumerable<T>
Je vois deux méthodes de GetEnumerator
: un retour IEnumerator
et d'autres IEnumerator<T>
. Quand dois-je utiliser un ou l'autre?
La solution
Si vous implémentez la IEnumerable<T>
interface générique, vous aurez à peu près toujours avoir à utiliser la méthode GetEnumerator générique -. Sauf si vous lancez votre objet explicitement (non générique) IEnumerable
La raison en est en arrière avec 1,0 compatibilité / .NET 1.1 qui ne prennent pas en charge les médicaments génériques.
Autres conseils
Vous implémentez généralement à la fois. L'une est la plus récente, version générique qui renvoie un recenseur de typesafe (de IEnumerator<T>
). L'autre est pour la compatibilité avec le code Legacy (rendement de IEnumerator
). Une implémentation typique est:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
La raison pour laquelle il existe deux méthodes est parce que IEnumerable<T>
hérite de l'interface IEnumerable
de sorte que vous voyez la méthode générique de IEnumerable<T>
et la méthode non-générique de IEnumerable
.
Voici comment vous souhaitez implémenter l'interface dans votre type:
class Foo : IEnumerable<Foo>
{
public IEnumerator<Foo> GetEnumerator()
{
// do your thing here
}
// do a EIMI here and simply call the generic method
IEnumerator IEnumerable.GetEnumerator()
{
this.GetEnumerator();
}
}
En général appelle GetEnumerator()
GetEnumerator<T>()
, donc il ne devrait pas avoir beaucoup de différence dans le comportement. Quant à savoir pourquoi il existe deux méthodes, cela se fait pour la compatibilité ascendante et pour une utilisation dans une situation où T
n'est pas d'un grand intérêt (ou est tout simplement inconnue).
L'un est générique, l'autre pas. Je crois que le compilateur préfère utiliser la surcharge générique.