我知道有很多关于泛型,继承和类型推断的问题。但我真的很难理解当前行为背后的一些推理。我将在示例中指出我想在最后实现的目标。
interface IState { }
interface IEntity<T> where T : IState
{
T Get();
void Set(T model);
}
interface IRepository<T>
{
T GetById(Guid id);
void Save(T model);
}
class RepositoryA<T, V>
: IRepository<T> where T
: IEntity<V> where V
: IState
{
public T GetById(Guid id) {}
public void Save(T model) {}
}
class RepositoryB<T>
: IRepository<T> where T
: IEntity<IState>
{
public T GetById(Guid id) {}
public void Save(T model) {}
}
class Program
{
static void Main(string[] args)
{
IRepository<FireEntity> repoA = new RepositoryA<FireEntity, FireState>(); // Compiles fine
IRepository<FireEntity> repoB = new RepositoryB<FireEntity>(); // Compilation Error: FireEntity must be convertible to IEntity<IState>
IEntity<FireState> a = new FireEntity(); // Compiles fine
IEntity<IState> b = new FireEntity(); // fails to convert
}
class FireState: IState {}
class FireEntity : IEntity<FireState>
{
public FireState Get() {}
public void Set(FireState model) {}
}
}
我想使用RepositoryB<T>
的语法,但正如您所看到的,隐式转换不会像那样工作。
我无法理解如何cheat
编译器并获得所需的语法。
有任何解决方法吗?
P.S。显然这是真实代码的摘录,我不能使用Covariant out parameters for T