Por que não Enumerável.ToLookup<>() retornar um ILookup<,> e não uma Pesquisa<,>?

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

  •  27-09-2019
  •  | 
  •  

Pergunta

um método em Lookup<,> que não está em ILookup<,>:

public IEnumerable<TResult> ApplyResultSelector<TResult>(
    Func<TKey, IEnumerable<TElement>, TResult> resultSelector);

Qual é o tipo de retorno Enumerable.ToLookup<>() declarado ILookup<,> apesar do fato de que ele sempre parece retornar uma instância de Lookup<,>?Se o tipo de retorno em vez disso, foram declarados Lookup<,>, o método acima pode ser usado sem um elenco.

Foi útil?

Solução

As melhores práticas para a concepção de APIs públicas ditar que a devolução de uma interface é uma idéia melhor do que retornar uma classe concreta, porque você pode, em seguida, retornar a uma diferente classe concreta, se você precisa.O consumidor de que a API não deve confiar na devolvidos instância de um tipo específico.

Como você aponta, ToList e ToDictionary retorno de concreto, tipos, ao invés de incluir interfaces.Talvez a razão para isso é que ToList e ToDictionary foram feitos para retornar uma cópia que você pode modificar você deve querer.Desde o IList e IDictionary interfaces não garantem que eles são editáveis (que foi, possivelmente, uma má idéia), os designers decidiram voltar para o tipo concreto.

Imagine um hipotético ToIList() o método.Se chamado em uma matriz, que pode ser implementada para devolver-lhe uma cópia da matriz, porque as matrizes de implementar IList<T>.Em seguida, você poderá ser surpreendido ao descobrir que o chamar Add() lança.

Por outro lado, ILookup é uma leitura única interface, de modo que o acima não se aplica.Assim, não há razão não seguir as melhores práticas, como há com o ToList.

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