如何解决这个错误?无效方差:类型参数'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"。
为什么?如何修复?
谢谢
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();
}
}