0

假设我有一个具体的类——“Giraffe”,它实现了“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<> (第一个)不能编译?这是协方差的事情吗?接下来,知道如何完成类似于我正在尝试做的事情吗?

4

2 回答 2

3

是的,这是一个协方差的事情。如果你IMammalRepository这样定义:

public interface IMammalRepository<out T> where T : IMammal
{
    // ...
}

这应该可以解决您的问题。

于 2013-04-15T21:30:04.097 回答
0

查看 Eric Lippert关于协变和逆变的文。我认为这是一个十集的系列。

于 2013-04-15T21:34:22.640 回答