IEnumerable fornisce due metodi GetEnumerator - qual è la differenza tra loro?
-
05-09-2019 - |
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?
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.