Domanda

Quando ho emplement interfaccia IEnumerable<T> Vedo due metodi GetEnumerator: uno IEnumerator ritorno e altri IEnumerator<T>. Quando si usa uno o l'altro?

È stato utile?

Soluzione

Se si implementa l'interfaccia generica IEnumerable<T>, si sarà quasi sempre necessario utilizzare il metodo GetEnumerator generica -. A meno che lanci l'oggetto esplicitamente (non generica) IEnumerable

Il motivo è compatibilità all'indietro con .NET 1.0 / 1.1 che non supporta farmaci generici.

Altri suggerimenti

In genere è implementare entrambi. Uno è la versione più recente, generico che restituisce un enumeratore typesafe (IEnumerator<T>). L'altro è per la compatibilità con il codice legacy (rendimenti IEnumerator). Una tipica applicazione è il seguente:

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

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

La ragione per cui ci sono due metodi è perché IEnumerable<T> eredita l'interfaccia IEnumerable in modo che si sta vedendo il metodo generico dal IEnumerable<T> e il metodo non generico da IEnumerable.

Ecco come si desidera implementare l'interfaccia nel vostro tipo:

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

Di solito GetEnumerator() chiamate GetEnumerator<T>(), quindi non ci dovrebbe essere molta differenza nel comportamento. Per quanto riguarda il motivo per cui ci sono due metodi, questo è fatto per la compatibilità a ritroso e per l'uso in situazioni in cui T non è di grande interesse (o è solo sconosciuto).

L'uno è generico, l'altro non uno. Credo che il compilatore preferisce utilizzare l'overload generico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top