【发布时间】:2016-03-16 14:18:21
【问题描述】:
我有一个接口 IJob,所有 Job 类都从该接口继承,并且我有一个通用的 repo 类,它将处理所有类型的 IJob。
我面临的问题是我无法将Repository<Job1> 转换为Repository<IJob>,即使Job1 是IJob 的一种类型。
代码
internal class Program
{
public interface IJob { }
public class Job1 : IJob { }
public class Job2 : IJob { }
public class Repository<TJob>
where TJob : IJob
{
public List<TJob> GetJobs()
{
return new List<TJob>();
}
}
private static void Main(string[] args)
{
IJob iJob = new Job1(); // Valid
Repository<IJob> repo = new Repository<Job1>(); // Not Valid
}
}
有人可以告诉我为什么这在 C# 中不可能吗?在 C# 泛型中还有其他规则类型转换吗?
【问题讨论】:
-
您正在寻找通用方差...但在这种情况下,您将无法使您的类协变,因为类不支持方差。见msdn.microsoft.com/en-us/library/ms228359(v=vs.90).aspx
-
@JonSkeet 当然,让我看看
-
你必须做一些事情,比如让 Repository 显式实现一个非泛型 IRepository 接口,它提供对 IJob 集合的相同类型的访问,就像 Repository 对具体 Job 类的集合所做的那样。
-
这里每天都会问这个问题。还有一次:一盒橙子不是一盒水果。为什么不?因为你可以把一个苹果放进一盒水果里,但不能放进一盒橘子里。一盒水果不是一盒橙子。为什么?因为一盒水果可能包含一个苹果。结论:一盒水果和一盒橙子之间没有类型关系,不管水果和橙子之间是否存在关系。