【发布时间】:2014-04-29 17:28:06
【问题描述】:
我在实现存储库逻辑时遇到问题。在一个真实的项目中我使用了 Ninject,所以我对一些类使用了接口。现在我对这个问题做了一个非常简单的演示:
// ------- Base User -------------- //
public interface IBaseUser
{
int Id { get; set; }
}
public class BaseUser : IBaseUser
{
public int Id { get; set; }
}
// -------- Individual User --------//
public interface IIndividualUser : IBaseUser
{
string Gender { get; set; }
}
public class IndividualUser: BaseUser, IIndividualUser
{
public string Gender { get; set; }
}
// -------- Legal User --------//
public interface ILegalUser : IBaseUser
{
string VatNumber { get; set; }
}
public class LegalUser : BaseUser, ILegalUser
{
public string VatNumber { get; set; }
}
// -------- Base User Repo --------//
public interface IBaseUserRepo<T> where T: BaseUser
{
T GetById(int id);
}
public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
{
public T GetById(int id)
{
// logic...
}
}
// -------- Individual User Repo --------//
public interface IIndividualUserRepo : IBaseUserRepo<IndividualUser>
{
IndividualUser GetByGender(string gender);
}
public class IndividualUserRepo : BaseUserRepo<IndividualUser>, IIndividualUserRepo
{
public IndividualUser GetByGender(string gender)
{
// logic...
}
}
// -------- Legal User Repo --------//
public interface ILegalUserRepo : IBaseUserRepo<LegalUser>
{
LegalUser GetByVatNumber(string vatNumber);
}
public class LegalUserRepo : BaseUserRepo<LegalUser>, ILegalUserRepo
{
public LegalUser GetByVatNumber(string vatNumber)
{
// logic...
}
}
在这2行代码中:
public class IndividualUserRepo : BaseUserRepo<IndividualUser>, IIndividualUserRepo
public class LegalUserRepo : BaseUserRepo<LegalUser>, ILegalUserRepo
编译器会触发此错误:
“genericInterfaceTest.IndividualUser”类型不能用作类型 泛型类型或方法中的参数“T” 'genericInterfaceTest.BaseUserRepo'。没有隐式引用 从“genericInterfaceTest.IndividualUser”转换为 'genericInterfaceTest.IBaseUserRepo'。 C:\Work\Tests\genericInterfaceTest\genericInterfaceTest\Program.cs 77 18 genericInterfaceTest
和
“genericInterfaceTest.LegalUser”类型不能用作类型 泛型类型或方法中的参数“T” 'genericInterfaceTest.BaseUserRepo'。没有隐式引用 从“genericInterfaceTest.LegalUser”转换为 'genericInterfaceTest.IBaseUserRepo'。 C:\Work\Tests\genericInterfaceTest\genericInterfaceTest\Program.cs 91 18 genericInterfaceTest
只有当我在这行代码中实现接口 IBaseUserRepo 时才会发生这种情况:
public class BaseUserRepo<T> where T : BaseUser, IBaseUserRepo<T>
谁能解释一下我哪里错了。
【问题讨论】: