Retornar `IEnumerable<T>` x `List<T>` x `IReadOnlyList<T>`
Pergunta
Qual tipo você expõe no retorno de um método que devolve uma coleção em C#, e por que importa?
Resposta esperada
Expor `List<T>` num retorno público vaza detalhe de implementação e dá ao chamador poder de mutar a coleção interna (`.Add`, `.Clear`), além de te prender a `List` pra sempre. `IEnumerable<T>` é o mais abstrato — só permite iterar — mas carrega a armadilha da avaliação diferida: se por baixo é uma query LINQ preguiçosa, cada `foreach` reexecuta, e o chamador não sabe. `IReadOnlyList<T>` / `IReadOnlyCollection<T>` comunicam 'já materializado, você pode contar e indexar, mas não mexer' — geralmente a melhor escolha pra um retorno, devolvendo um `.ToList()` por trás. Regra: `IEnumerable<T>` pra streams/pipelines onde a preguiça é intencional e documentada; `IReadOnlyList<T>` pra 'aqui está a coleção pronta'; nunca `List<T>` público a menos que a mutabilidade seja o contrato.
Por que perguntam isso
Pergunta pleno/sênior de C#. Conecta com a pergunta de LINQ lazy. Sinal bom: a armadilha do `IEnumerable` lazy no retorno.