不能用泛型继承

jok*_*der 5 c# generics

这个类声明:

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 : IEntitySqlDataProvider : DataProvider<SqlEntity>,我得到这个错误:

错误1类型〜不能用作泛型类型或方法'〜.Repository'中的类型参数'TD'.没有从'〜.SqlDataProvider'到'〜.DataProvider'的隐式引用转换.

为什么它不能将SqlEntity转换为它实现的接口?

Ond*_*cny 4

问题在于SqlRepository<TE>您正在修复 的TD内部通用参数(该参数TERepository<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用法是一致的。