无法将通用类转换为通用接口,为什么?

kim*_*3er 1 c# inheritance repository

我有一个继承自的IRepository接口IRepository<TObject>.我还有一个继承自S的SqlRepository类,而S QLRepository<TObject>又实现了IRepository<TObject>.为什么我不能将SqlRepository的实例实例化为IRepository?

public class MyObject : IObject {
    ...
}

public interface IRepository<TObject> where TObject : IObject, new() {
    ...
}

public interface IRepository : IRepository<MyObject> { }

public class SqlRepository<TObject> : IRepository<TObject> where TObject : IObject, new() {
    ...
}

public class SqlRepository : SqlRepository<MyObject> { }

public class Controller {
    private IRepository _repository;

    public Controller() {
        _repository = new SqlRepository();
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试将新的SqlRepository分配给Controller类中的_repository时,上面的示例失败,并显示以下错误消息.

Argument '1': cannot convert from 'SqlRepository' to 'IRepository'
Run Code Online (Sandbox Code Playgroud)

我没有掌握哪种基本的继承原则,请帮忙.

Meh*_*ari 10

因为IRepository是一种IRepository<MyObject>而不是相反.

基本上:

SqlRepositorySqlRepository<MyObject>
这是一个IRepository<MyObject>.
为了使这项工作,您应该继承IRepository<TObject>IRepository或使SqlRepository实现IRepository取决于在你的意图.

这个问题根本不是特定于泛型的.假设:

interface IMovable { }
interface IDrivable : IMovable { } 
class Ball : IMovable { }
Run Code Online (Sandbox Code Playgroud)

显而易见的BallIDrivable,它不是一段时间IMovable.