Solução mais moderna
A menos que você precise que a coleção interna seja mutável, você pode usar o System.Collections.Immutable
pacote, alterar seu tipo de campo para ser uma coleção imutável e expô-la diretamente - assumindo que Foo
ela é imutável, é claro.
Resposta atualizada para responder à pergunta mais diretamente
Existe algum motivo para expor uma coleção interna como um ReadOnlyCollection em vez de um IEnumerable se o código de chamada iterar apenas sobre a coleção?
Depende de quanto você confia no código de chamada. Se você tiver controle total sobre tudo o que chamará esse membro e garantir que nenhum código será usado:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
então, certamente, nenhum dano será causado se você apenas devolver a coleção diretamente. Eu geralmente tento ser um pouco mais paranóico do que isso.
Da mesma forma, como você diz: se você só precisa IEnumerable<T>
, por que se amarrar a algo mais forte?
Resposta original
Se você estiver usando o .NET 3.5, evite fazer uma cópia e evitar a conversão simples usando uma chamada simples para Ignorar:
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(Existem muitas outras opções para agrupar trivialmente - o Skip
mais interessante de Selecionar / Onde é que não há delegado para executar sem sentido para cada iteração.)
Se você não estiver usando o .NET 3.5, você pode escrever um invólucro muito simples para fazer a mesma coisa:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
ReadOnlyCollection
se for paranóico, mas agora não está vinculado a uma implementação específica.