Por que não Enumerável.ToLookup<>() retornar um ILookup<,> e não uma Pesquisa<,>?
-
27-09-2019 - |
Pergunta
Há 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.
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
.