C#泛型和继承 - 通用参数类型推断

时间:2017-03-15 22:39:23

标签: c# generics inheritance type-inference

我知道有很多关于泛型,继承和类型推断的问题。但我真的很难理解当前行为背后的一些推理。我将在示例中指出我想在最后实现的目标。

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

0 个答案:

没有答案