如何解决这个错误?无效方差:类型参数'T'必须始终有效

本文关键字:类型参数 有效 方差 解决 何解决 无效 错误 | 更新日期: 2023-09-27 18:08:29

我在编译时有以下错误消息:

"无效方差:类型参数'T'必须在'ConsoleApplication1.IRepository.GetAll()'上始终有效。T是协变的。"

,下面是我的代码:

 class Program
{
    static void Main(string[] args)
    {
        IRepository<BaseClass> repository;
        repository = new RepositoryDerived1<Derived1>();
        Console.ReadLine();
    }
}
public abstract class BaseClass
{
}
public class Derived1 : BaseClass
{
}
public interface IRepository<out T> where T: BaseClass, new()
{
    IList<T> GetAll();
}
public class Derived2 : BaseClass
{
}
public abstract class RepositoryBase<T> : IRepository<T> where T: BaseClass, new()
{
    public abstract IList<T> GetAll();
}
public class RepositoryDerived1<T> : RepositoryBase<T> where T: BaseClass, new()
{
    public override IList<T> GetAll()
    {
        throw new NotImplementedException();
    }
}
我需要的是能够像这样使用上面的类:

IRepository库;

RepositoryBase库;

那么我希望能够像这样赋值:

repository = new RepositoryDerived1();

但是它在IRepository类上给出编译时错误。

如果我从IRepository类中删除"out"关键字,它会给我另一个错误

"RepositoryDerived1"不能转换为"IRepository"。

为什么?如何修复?

谢谢

如何解决这个错误?无效方差:类型参数'T'必须始终有效

IList<T>不协变。如果您将IList<T>更改为IEnumerable<T>,并从IRepository<out T>中删除: new()约束(作为抽象基类不满足),它将工作:

public interface IRepository<out T> where T : BaseClass
{
    IEnumerable<T> GetAll();
}
public abstract class RepositoryBase<T> : IRepository<T> where T : BaseClass, new()
{
    public abstract IEnumerable<T> GetAll();
}
public class RepositoryDerived1<T> : RepositoryBase<T> where T : BaseClass, new()
{
    public override IEnumerable<T> GetAll()
    {
        throw new NotImplementedException();
    }
}