Я недавно столкнулся с проблемой при попытке добавить AddRange (IEnumerable) в список. Вероятно, классическая проблема, но я пока не понимаю.
Я понимаю, что методы, ожидающие параметр List, не удовлетворяются списком, поскольку они могут попытаться добавить базу в список, что, очевидно, невозможно.
Но если я правильно понял, поскольку сами IEnumerables не могут быть изменены, в этом случае это должно сработать.
Код, о котором я подумал, выглядит следующим образом:
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
}
}
Я попытался передать подсказку компилятору в методе AddRange2, но это просто перешло к проблеме.
Мой образ мышления несовершенен? Это ограничение языка или оно задумано?
IIRC, поддержка такого рода операций была добавлена в Java 1.5, поэтому, возможно, она будет добавлена в C # в будущем, тоже ...?