Недавно я столкнулся с проблемой при попытке добавить AddRange(IEnumerable) в список. Вероятно, это классическая проблема, но я еще не совсем понял.
Я понимаю, что методы, ожидающие параметр List, не удовлетворяются списком, потому что они могут попытаться добавить Base в список, что, очевидно, невозможно.
Но если я правильно понимаю, поскольку сами 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 # ...?