C#在列表

时间:2016-02-21 06:07:23

标签: c# templates

我有这样的课程

  

CountryRepository

public class CountryRepository : BaseRepository<Country>

其中

  

BaseRepository

public abstract class BaseRepository<DT> : IRepository<DT>
    where DT : IDomainEntity

  

IRepository

作为

public interface IRepository<DT>
    where DT : IDomainEntity

我想将类存储在列表中

this.Repositories = new List<BaseRepository<IDomainEntity>>();
var o = new CountryRepository();
this.Repositories.Add(o);
  

错误4参数1:无法从“CountryRepository”转换为   'BaseRepository'

它不起作用,我哪里出错了。

2 个答案:

答案 0 :(得分:3)

  

我哪里出错

CountryRepository派生自BaseRepository<Country>,与BaseRepository<IDomainEntity>期望的List类型的作业不兼容。

以下是如何解决的问题:

选项1:将非泛型抽象类作为类层次结构的根,并从中派生泛型类。

public abstract class BaseRepository

public abstract class BaseRepository<DT>: BaseRepository, IRepository<DT>
   where DT: IDomainEntity

public class CountryRepository: BaseRepository<Country>


this.Repositories = new List<BaseRepository>();
var o = new CountryRepository();
this.Repositories.Add(o);

选项2:接口协方差。如果DT仅用作IRepository声明中的输出参数类型,方法返回类型或只读属性类型,则它将起作用。

public interface IRepository<out DT> where DT: IDomainEntity

public abstract class BaseRepository<DT> : IRepository<DT>
  where DT : IDomainEntity

public class CountryRepository : BaseRepository<Country>

// Note the usage of IRepository<IDomainEntity>, not BaseRepository 
this.Repositories = new List<IRepository<IDomainEntity>>();   
var o = new CountryRepository();
this.Repositories.Add(o);

答案 1 :(得分:1)

之间存在差异
BaseRepository<Country> 

和BaseRepository。

您的CountryRepository派生自

BaseRepository<Country> 

而不是来自BaseRepository,因此您会收到错误。

分配继承权:

public class CountryRepository : BaseRepository