¿Cuál prefieres para las interfaces: T [], IEnumerable <T>, IList <T> u otra?

Bien, espero que la comunidad en general nos ayude a resolver un debate sobre el lugar de trabajo que ha estado en curso durante un tiempo. Esto tiene que ver con la definición de interfaces que aceptan o devuelven listas de algún tipo. Hay varias maneras de hacer esto:

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

Mi preferencia es usar IEnumerable para argumentos y matrices para valores de retorno:

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

Mi argumento para este enfoque es que la clase de implementación puede crear una Lista directamente desde IEnumerable y simplemente devolverla con List.ToArray (). Sin embargo, algunos creen que se debería devolver IList en lugar de una matriz. El problema que tengo aquí es que ahora es necesario volver a copiarlo con ReadOnlyCollection antes de volver. La opción de devolver IEnumerable parece problemática para el código de cliente?

¿Qué usas / prefieres? (especialmente con respecto a las bibliotecas que serán utilizadas por otros desarrolladores fuera de su organización)

Respuestas a la pregunta(8)

Su respuesta a la pregunta