IEnumerable fornece dois métodos GetEnumerator - qual é a diferença entre eles?
-
05-09-2019 - |
Pergunta
Quando eu emplement IEnumerable<T>
interface I ver dois métodos GetEnumerator
: um retorno IEnumerator
e outros IEnumerator<T>
. Quando usar um ou outro?
Solução
Se você está implementando a interface genérica IEnumerable<T>
, você será muito bem sempre tem que usar o método GetEnumerator genérica -. A menos que você lançar o seu objeto explicitamente (não-genérico) IEnumerable
A razão é para trás compatibilidade com .NET 1.0 / 1.1 que não apoiar genéricos.
Outras dicas
Você normalmente implementar ambos. Uma delas é a versão mais recente, genérico que retorna um enumerador typesafe (IEnumerator<T>
). A outra é a compatibilidade com o código de legado (retornos IEnumerator
). Uma implementação típica é:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
A razão existem dois métodos é porque herda IEnumerable<T>
a interface de IEnumerable
assim que você está vendo o método genérico de IEnumerable<T>
eo método não-genérico de IEnumerable
.
Aqui está como você deseja implementar a interface em seu 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();
}
}
chamadas Normalmente GetEnumerator()
GetEnumerator<T>()
, por isso não deve haver muita diferença no comportamento. Quanto à razão existem dois métodos, isto é feito para compatibilidade com versões anteriores e para uso em situações em que T
não é de grande interesse (ou é apenas desconhecido).
O primeiro é genérico, o outro não um. Eu acredito que o compilador prefere usar a sobrecarga genérico.