2009-02-18 11 views

risposta

8

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

Il motivo è la retrocompatibilità con .NET 1.0/1.1 che non supportava i generici.

2

L'uno è generico, l'altro no. Credo che il compilatore preferisca usare il sovraccarico generico.

4

Di solito GetEnumerator() chiamate GetEnumerator<T>(), quindi non ci dovrebbero essere molte differenze di comportamento. Per quanto riguarda il motivo per cui ci sono due metodi, questo è fatto per la retrocompatibilità e per l'uso in situazioni in cui T non è di grande interesse (o è solo sconosciuto).

9

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

+1 - EIMI = Implementazione esplicita membro interfaccia –

+0

Ma come mai "Foo: IEnumerable " ha senso? – nawfal

30

Di solito implementare entrambi. Uno è la versione più recente e generica che restituisce un enumeratore typesable (IEnumerator<T>). L'altro è compatibile con il codice Legacy (restituisce IEnumerator). Una tipica applicazione è:

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

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

questo mi ha aiutato molto, evitando la classe extra per l'enumeratore annidato! –

+0

+1. Ho anche cercato su google per trovare un'implementazione di riferimento che evitasse la classe di enumeratore annidata e questa è stata la prima risposta a cui sono arrivato. –

Problemi correlati