抽象类列表

Pie*_*adz 12 c# list abstract

我有抽象类:

public abstract class MyClass
{
    public abstract string nazwa
    {
        get;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有两个继承自MyClass的类:

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

public class MyClass2 : MyClass
{
    public override string nazwa
    {
        get { return "bbb"; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我创建了List:

List<MyClass> myList;
Run Code Online (Sandbox Code Playgroud)

现在我想创造

myList = new List<MyClass1>;
Run Code Online (Sandbox Code Playgroud)

编译器显示错误:

Cannot implicitly convert type 'System.Collections.Generic.List<Program.MyClass1>' to 'System.Collections.Generic.List<Program.MyClass>'
Run Code Online (Sandbox Code Playgroud)

我必须有一些简单的方法来转换它...我找不到任何有用的东西

SLa*_*aks 12

将a转换List<Derived>为a 是不安全的List<Base>.

如果你写的话,你期望发生什么?

List<MyClass1> derivedList = ...
List<MyClass> baseList = derivedList;
baseList.Add(new MyClass2());    //Boom!
Run Code Online (Sandbox Code Playgroud)

你要求协方差 ; 只有只读接口才能实现协方差.
因此,IEnumerable<Derived>可转换为IEnumerable<Base>.


Joe*_*ham 9

您可以将列表创建为基本类型:

List<MyClass> myList = new List<MyClass>();
Run Code Online (Sandbox Code Playgroud)

然后,您可以将派生项添加到:

myList.Add(new MyClass2());
Run Code Online (Sandbox Code Playgroud)