如何修复这个错误?无效方差:类型参数“T”;必须始终有效
我在编译时收到以下错误消息:
“无效方差:类型参数 '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”。
为什么以及如何解决它?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
IList
不是协变的。如果将IList
更改为IEnumerable
,并从IRepository: new()
约束T> (因为抽象基类不满足这一点)它将起作用:IList<T>
is not covariant. If you change theIList<T>
toIEnumerable<T>
, and remove the: new()
constraint fromIRepository<out T>
(as the abstract base class doesn't satisfy that) it'll work: