Список абстрактного класса

У меня есть абстрактный класс:

public abstract class MyClass
{
    public abstract string nazwa
    {
        get;
    }
}

И два класса, которые наследуются от MyClass:

public class MyClass1 : MyClass
{
    public override string nazwa
    {
        get { return "aaa"; }
    }
}

public class MyClass2 : MyClass
{
    public override string nazwa
    {
        get { return "bbb"; }
    }
}

В другом классе я создаю List:

List<MyClass> myList;

Теперь я хочу создать

myList = new List<MyClass1>;

В компиляторе отображается сообщение об ошибке:

Cannot implicitly convert type 'System.Collections.Generic.List<Program.MyClass1>' to 'System.Collections.Generic.List<Program.MyClass>'

У меня должен быть простой способ его преобразования... Я не могу найти ничего полезного

Ответ 1

Вы можете создать список в качестве базового типа:

List<MyClass> myList = new List<MyClass>();

Затем вы можете добавить производные элементы в:

myList.Add(new MyClass2());

Ответ 2

Неверно преобразовать a List<Derived> в List<Base>.

Что вы ожидаете, если напишете

List<MyClass1> derivedList = ...
List<MyClass> baseList = derivedList;
baseList.Add(new MyClass2());    //Boom!

Вы просите ковариацию; ковариация возможна только с интерфейсами только для чтения.
Таким образом, IEnumerable<Derived> преобразуется в IEnumerable<Base>.

Ответ 3

У вас должен быть список базового класса, а позже вы можете использовать Linq для получения списка элементов MyClas1, когда вам это нужно.

 List<MyClass> BaseList = new ...

 BaseList.FillWithItems();

 List<MyClass1> DerivedList = BaseList.OfType<MyClass1>().ToList();