这个类声明:
public abstract class Repository<TE, TD>
where TE : class, IEntity, new()
where TD : DataProvider<TE>
Run Code Online (Sandbox Code Playgroud)
此类签名无法实现:
public class SqlRepository<TE> : Repository<TE, SqlDataProvider>
where TE : SqlEntity, new()
Run Code Online (Sandbox Code Playgroud)
哪里SqlEntity : IEntity和SqlDataProvider : DataProvider<SqlEntity>,我得到这个错误:
错误1类型〜不能用作泛型类型或方法'〜.Repository'中的类型参数'TD'.没有从'〜.SqlDataProvider'到'〜.DataProvider'的隐式引用转换.
为什么它不能将SqlEntity转换为它实现的接口?
问题在于SqlRepository<TE>您正在修复 的TD内部通用参数(该参数TE在Repository<TE, TD>声明中链接到),SqlEntity但无法告知TE,它是通用的。
你能做的就是保持TD通用,SqlDataProvider如下所示:
public class SqlDataProvider<TD> : DataProvider<TD>
where TD : SqlEntity
Run Code Online (Sandbox Code Playgroud)
然后将这种依赖性表现出来,SqlRepository如下所示:
public class SqlRepository<TE> : Repository<TE, SqlDataProvider<TE>>
where TE : SqlEntity, new()
Run Code Online (Sandbox Code Playgroud)
这可以编译,因为TE用法是一致的。