J'ai récemment rencontré des problèmes lors de la tentative d'ajout de AddRange (IEnumerable) à une liste. Probablement un problème classique, mais je ne l'ai pas encore compris. Je comprends que les méthodes qui attendent un paramètre List ne sont pas satisfaites d'une liste, car elles pourraient essayer d'ajouter une base à la liste, ce qui est évidemment impossible.C# Impossible de convertir IEnumerable <Base> en IEnumerable <Derived>
Mais si je comprends bien, étant donné que IEnumerables ne peut pas être modifié, il devrait fonctionner dans ce cas.
Le code que je pensais ressemble à ceci:
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
}
}
J'ai essayé de passer une allusion au compilateur dans la méthode AddRange2, mais cela vient d'emménager à un problème autour.
Est-ce que ma façon de penser est défectueuse? Est-ce une limitation de la langue ou est-ce intentionnellement? Le support de ce type d'opérations a été ajouté à Java 1.5, donc peut-être sera-t-il ajouté à C# dans le futur, aussi ...?
Dupliquer de nombreuses autres questions, y compris plus récemment http://stackoverflow.com/questions/632399 –
En effet, je suis désolé. Mon google-jutsu a encore besoin d'amélioration. – mafu
Pas de problème. Il serait bon d'avoir une FAQ par-tag, IMO ... –