OriginalGriff
Проблема в том, что эти два списка не являются ковариантный:
Цитата:
В объектно-ориентированном программировании ковариантный возвращаемый тип метода-это тот, который может быть заменен" более узким " типом, когда метод переопределен в подклассе. Примечательным языком, в котором это довольно распространенная парадигма, является C++. C# не поддерживает ковариацию возвращаемого типа.
(
Ковариантный тип возврата-Википедия[
^])
Это в основном означает, что если вы создаете коллекции:
class Animal {...}
class Ape : Animal {...}
class Feline : Animal {...}
List<Ape> apes = new List<Ape>();
List<Feline> cats = new List<Feline>();
List<Animal> animals = new List<Animal>();
Затем, поскольку обезьяна-это животное, вы можете добавить новый вид в любую коллекцию:
Ape newSpecies = new Ape("Pans Sapiens");
apes.Add(newSpecies);
animals.Add(newSpecies);
Но если вы попытаетесь добавить его к кошачьим:
cats.Add(newSpecies);
Вы получите ошибку компиляции:
Argument 1: cannot convert from 'GeneralTesting.frmMain.Ape' to 'GeneralTesting.frmMain.Feline'
Именно этого и следовало ожидать.
Но... если бы вы могли делать то, что хотите, вы могли бы сделать это:
Ape newSpecies = new Ape("Pans Sapiens");
animals = cats;
animals.Add(newSpecies);
И у вас будет обезьяна в вашей кошачьей коллекции - это означает, что ваше приложение рухнет позже, когда вы попытаетесь его использовать.
Вы можете добавить все элементы:
animals = new List<Animal>();
List<Ape> apes = new List<Ape>();
List<Feline> cats = new List<Feline>();
...
animals.AddRange(apes);
animals.AddRange(cats);
Или даже явно:
animals = new List<Animal>();
List<Ape> apes = new List<Ape>();
List<Feline> cats = new List<Feline>();
...
animals.AddRange(apes.ConvertAll(x => (Animal)x));
animals.AddRange(cats.ConvertAll(x => (Animal)x));
Но вы не можете назначить элементы, которые не являются ковариантными.