假设我有一个具体的类 - '长颈鹿'实现'IMammal'。在我的场景中,我可以像这样创建一个通用的存储库和工厂:
public MammalFactory : IMammalFactory
{
public IMammalRepository<T> GetMammalRepo<T>() where T: IMammal, new()
{
return new MammalRepository<T>();
}
}
MammalRepository现在可以是Giraffe或Antelope类型,只要它们都实现IMammal。到目前为止,非常好。
但是,我不能使用这样的表达式(不会编译也不能转换):
Func<IMammalRepository<IMammal>> = () => this.factory.GetMammalRepo<Giraffe>();
我的类之间有一个非常相似的方法,我想把它们分解为:
//called from different implementations
public void FeedAnimalInternal(Func<IMammalRepository<IMammal>> repo, Action<IMammal> doIt)
{
var animalRepo = repo();
var animals = animalRepo.GetAnimals(); //might be giraffe or might be something else
foreach (var animal in animals) { doIt(animal); }
}
首先,为什么Func&lt;&gt; (第一个)编译?这是一个协方差的事吗?接下来,任何想法我如何能够完成类似于我想做的事情?
答案 0 :(得分:3)
是的,这是一个协方差的事情。如果你这样定义IMammalRepository
:
public interface IMammalRepository<out T> where T : IMammal
{
// ...
}
这可以解决您的问题。
答案 1 :(得分:0)
在posts上查看Eric Lippert的博客Covariance and Contravariance。这是我认为的十部分系列。