C # Não é possível converter de IEnumerable <Base> para IEnumerable <Derived>

Recentemente, tive problemas ao tentar adicionar AddRange (IEnumerable) a uma lista. Provavelmente um problema clássico, mas ainda não o entendi.

Entendo que os métodos que esperam um parâmetro de Lista não estão satisfeitos com uma Lista, porque eles podem tentar adicionar uma Base à Lista, o que é obviamente impossíve

Mas se eu conseguir isso corretamente, já que o IEnumerables não pode ser alterado, ele deve funcionar nesse cas

O código em que pensei se parece com isso:

class Foo
{
}

class Bar : Foo
{
}

class FooCol
{
    private List<Foo> m_Foos = new List<Foo> ();

    public void AddRange1(IEnumerable<Foo> foos)
    {
        m_Foos.AddRange (foos); // does work
    }

    public void AddRange2<T>(IEnumerable<T> foos) where T : Foo
    {
        m_Foos.AddRange (foos); // does not work
    }
}

class Program
{
    static void Main(string[] args)
    {
        FooCol fooCol = new FooCol ();

        List<Foo> foos = new List<Foo> ();
        List<Bar> bars = new List<Bar> ();

        fooCol.AddRange1 (foos); // does work
        fooCol.AddRange1 (bars); // does not work

        fooCol.AddRange2 (foos); // does work
        fooCol.AddRange2 (bars); // does work
    }
}

Tentei passar uma dica para o compilador no método AddRange2, mas isso acabou de mudar para o problem

É a minha maneira de pensar falho? Isso é uma limitação do idioma ou é por design?

IIRC, o suporte para esse tipo de operação foi adicionado ao Java 1.5, então talvez ele também seja adicionado ao C # em algum momento no futuro ...?

questionAnswers(4)

yourAnswerToTheQuestion