IEnumerable bietet zwei GetEnumerator Methoden - was ist der Unterschied zwischen ihnen?

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

  •  05-09-2019
  •  | 
  •  

Frage

Wenn ich emplement IEnumerable<T> Schnittstelle I zwei GetEnumerator Methoden sehen: eine Rückkehr IEnumerator und andere IEnumerator<T>. Wann würde ich den einen oder anderen verwenden?

War es hilfreich?

Lösung

Wenn Sie die IEnumerable<T> generische Schnittstelle implementieren, werden Sie ziemlich immer die generische Methode GetEnumerator verwenden -., Wenn Sie Ihr Objekt geworfen explizit auf (nicht-generic) IEnumerable

Der Grund dafür ist rückwärts Kompatibilität mit .NET 1.0 / 1.1, die Generika nicht unterstützen.

Andere Tipps

Sie in der Regel beide implementieren. Eine davon ist die neuere, generische Version, die eine typsichere Enumerator zurück (IEnumerator<T>). Der andere ist für die Kompatibilität mit Legacy-Code (kehrt IEnumerator). Eine typische Implementierung ist:

public IEnumerator<T> GetEnumerator() {
    foreach(T item in items) {
        yield return item;
    }
}

IEnumerator IEnumerable.GetEnumerator() {
    return GetEnumerator();
}

Der Grund gibt es zwei Methoden, weil IEnumerable<T> die IEnumerable Schnittstelle erbt, so dass Sie die generische Methode von IEnumerable<T> sehen und die nicht-generische Methode von IEnumerable.

Hier ist, wie Sie die Schnittstelle in Ihrer Art implementieren möchten:

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();
    }
}

In der Regel GetEnumerator() ruft GetEnumerator<T>(), so sollte es nicht viel Unterschied im Verhalten sein. Was, warum zwei Methoden gibt, ist dies für die Abwärtskompatibilität getan und für den Einsatz in Situation, wo T nicht von großen Interesse ist (oder gerade unbekannt).

Das ist generisch, die andere nicht. Ich glaube, dass der Compiler bevorzugt die allgemeine Überlastung zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top