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 ...?