将泛型类型 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# 抱怨 没有从 Cat
到 IAnimal
的隐式转换,即使它实现了它。似乎没有演员可以解决这个问题。
知道我做错了什么吗?
编辑:这里是 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>
是不变的。只有接口可以标记为变体,类 不能。
我不确定我的问题是否清楚,所以我将通过代码说明清楚:
基本上我有一个加载器接口,泛型是一个接口。 在这里,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# 抱怨 没有从 Cat
到 IAnimal
的隐式转换,即使它实现了它。似乎没有演员可以解决这个问题。
知道我做错了什么吗?
编辑:这里是 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>
是不变的。只有接口可以标记为变体,类 不能。