无法将类型System.Collections.Generic.List <deriveddataclass>隐式转换为System.Collections.Generic.List <basedataclass>

时间:2019-02-08 13:52:24

标签: c# generics inheritance

我需要一个抽象类,其中包含一个方法来返回从基类或接口派生的项目列表。我的代码如下:

public abstract class Template
{
    //this should return the data to be used by the template
    public abstract List<BaseDataClass> GetDataSource(string sectionName);
}

然后我有一个派生数据类,专门用于派生模板类:

public class DerivedDataClass : BaseDataClass
{
     //some properties specific to the derived class
}

然后我有一个主要的派生模板类,它继承了抽象类。在这里,我想返回DerivedDataClass的列表。

public class DerivedTemplate : Template
{
    public override List<BaseDataClass> GetDataSource(string sectionName)
    {
        List<DerivedDataClass> data = new List<DerivedDataClass>();

        //add some stuff to the list

        return data;
    }
 }

当我尝试返回该列表时,我得到一个'不能将类型System.Collections.Generic.List隐式转换为System.Collections.Generic.List。

我意识到这些类型之间没有直接转换,但是我不确定如何实现。将来会有更多派生的模板类和派生的数据类,我将需要使用GetDataSource函数来获取数据项列表。  我想我已经想过了,但是我已经呆了一会儿了,不确定我应该朝哪个方向前进。

2 个答案:

答案 0 :(得分:2)

data列表的类型必须为List<BaseDataClass>,而不是List<DerivedDataClass>

例如,它将编译:

List<BaseDataClass> data = new List<DerivedDataClass>().Select(x => (BaseDataClass)x).ToList();

您可以创建一个列表并添加以下项:

List<BaseDataClass> data = new List<BaseDataClass>();
data.Add(new DerivedDataClass());

答案 1 :(得分:1)

List<T>T不相关,因此List<Derived>不能转换为List<Base>

想象List<T>将是协变的。您可以这样写:

List<Base> bases = new List<Derived1>();
bases.Add(new Derived2());

这里Derived2Derived1是不同的派生类。这是一个错误,因此ListT没有协变关系。

那你该怎么办?

IEnumerable<T>是协变的

var bases = new List<Base>(deriveds.AsEnumerable());

LINQ的Cast

var bases = deriveds.Cast<Base>()
                    .ToList();