将泛型类型 class 实现接口分配给作为接口的泛型类型

Assign generic type class implementing interface to generic type being interface

我不确定我的问题是否清楚,所以我将通过代码说明清楚:

基本上我有一个加载器接口,泛型是一个接口。 在这里,Cat 和 Dog 都实现了 IAnimal。

private readonly IAnimalLoader<Cat> _catLoader;
private readonly IAnimalLoader<Dog> _dogLoader;

private IAnimalLoader<IAnimal> animalLoader;

public AnimalService(IAnimalLoader<Cat> catLoader,
                     IAnimalLoader<Dog> dogLoader)
{
    _catLoader = catLoader;
    _dogLoader = dogLoader;
}

问题是在尝试将任一加载程序分配给 animalLoader 时:

if (animal == AnimalType.Cat)
{
    animalLoader = _catLoader;
}
else
{
    animalLoader = _dogLoader;
}

C# 抱怨 没有从 CatIAnimal 的隐式转换,即使它实现了它。似乎没有演员可以解决这个问题。

知道我做错了什么吗?

编辑:这里是 IAnimalLoader 以供澄清

public interface IAnimalLoader<T> where T : IAnimal
{
    IQueryable<T> GetAllQueryable();
    Task<T> GetAsync(string id);
}

虽然 Cat 实现了 IAnimal,但 IAnimalLoader<Cat>IAnimalLoader<IAnimal> 没有这种关系,这就是错误消息的内容。

一般情况下,需要将泛型参数标记为协变才能成功转换,语法为out T IIRC,否则,请查看C# language reference on generics' variance

已更新(感谢下面的评论):在您的情况下,即使这样也是不可能的,因为其中一种类型 Task<T> 是不变的。只有接口可以标记为变体,类 不能。