Niedawno wpadł w kłopoty, gdy próbuje AddRange (IEnumerable) do listy. Prawdopodobnie klasyczny problem, ale tak naprawdę go jeszcze nie dostaję.C# Nie można przekonwertować z IEnumerable <Base> do IEnumerable <Derived>
Rozumiem, że metody oczekujące parametru List nie są usatysfakcjonowane Listą, ponieważ mogą próbować dodać Bazę do Listy, co oczywiście jest niemożliwe.
Ale jeśli mam to poprawnie, ponieważ IEnumerables nie mogą być zmienione, powinno to działać w tym przypadku.
Kod myślałem wygląda następująco:
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
}
}
starałem się przekazać wskazówkę do kompilatora w metodzie AddRange2, ale to po prostu przeniósł się do problemu dookoła.
Czy mój sposób myślenia jest wadliwy? Czy jest to ograniczenie języka, czy jest to z założenia?
IIRC, wsparcie dla tego rodzaju operacji zostało dodane do Java 1.5, więc może będzie dodane do C# w pewnym momencie w przyszłości, zbyt ...?
Duplikat różnych innych pytań, w tym ostatnio http://stackoverflow.com/questions/632399 –
Rzeczywiście, przepraszam. Moje google-jutsu wciąż wymaga poprawy. – mafu
Bez problemu. Byłoby miło mieć FAQ na temat tagów, IMO ... –