IEnumerable fournit deux méthodes de GetEnumerator - quelle est la différence entre eux?

StackOverflow https://stackoverflow.com/questions/560678

  •  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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top