Недавно я столкнулся с трудностями при попытке добавить AddRange (IEnumerable) в список. Вероятно, это классический вопрос, но я пока не понимаю его.C# Невозможно преобразовать из IEnumerable <Base> в IEnumerable <Derived>
Я понимаю, что методы, ожидающие параметра List, не удовлетворяются с 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, так что, возможно, в какой-то момент она будет добавлена и в будущем ...?
Дубликат различных других вопросов, в том числе совсем недавно http://stackoverflow.com/questions/632399 –
Действительно, извините. Мой google-jutsu все еще нуждается в улучшении. – mafu
Нет проблем. Было бы неплохо иметь FAQ по каждому тегу, IMO ... –