IEnumerable fornece dois métodos GetEnumerator - qual é a diferença entre eles?

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

  •  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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top