Qual você prefere para interfaces: T [], IEnumerable <T>, IList <T> ou outro?

Ok, eu estou esperando que a comunidade em geral nos ajude a resolver um debate no local de trabalho que está em andamento há algum tempo. Isso tem a ver com a definição de interfaces que aceitam ou retornam listas de algum tipo. Existem várias maneiras de fazer isso:

public interface Foo
{
    Bar[] Bars { get; }
    IEnumerable<Bar> Bars { get; }
    ICollection<Bar> Bars { get; }
    IList<Bar> Bars { get; }
}

Minha preferência é usar IEnumerable para argumentos e matrizes para valores de retorno:

public interface Foo
{
    void Do(IEnumerable<Bar> bars);
    Bar[] Bars { get; }
}

Meu argumento para essa abordagem é que a classe de implementação pode criar uma List diretamente do IEnumerable e simplesmente retorná-la com List.ToArray (). No entanto, alguns acreditam que o IList deve ser retornado em vez de um array. O problema que tenho aqui é que agora é necessário novamente copiá-lo com um ReadOnlyCollection antes de retornar. A opção de retornar IEnumerable parece problemático para o código do cliente?

O que você usa / prefere? (especialmente com relação a bibliotecas que serão usadas por outros desenvolvedores fora da sua organização)

questionAnswers(8)

yourAnswerToTheQuestion