C# 使用泛型进行类型转换

C# 使用泛型进行类型转换,c#,generics,C#,Generics,假设我有一个具体的类--“Giraffe”,它实现了“IMammal”。在我的场景中,我可以创建一个通用存储库和工厂,如下所示: public MammalFactory : IMammalFactory { public IMammalRepository<T> GetMammalRepo<T>() where T: IMammal, new() { return new MammalRepository<T>();

假设我有一个具体的类--“Giraffe”,它实现了“IMammal”。在我的场景中,我可以创建一个通用存储库和工厂,如下所示:

public MammalFactory : IMammalFactory
{
    public IMammalRepository<T> GetMammalRepo<T>() where T: IMammal, new()
    {
        return new MammalRepository<T>();
    }
}
公共工厂:IMammalFactory
{
公共IMammalRepository getMailomaprepo(),其中T:IMammal,new()
{
返回新的存储库();
}
}
哺乳动物存储库现在可以是长颈鹿或羚羊类型,只要它们都实现IMammal。到目前为止,一切顺利

但是,我不能使用这样的表达式(不会编译也不能强制转换):

Func=()=>this.factory.getrepo();
我的类之间有一个非常相似的方法,我想将它们分解为以下几种:

//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); }
}
//从不同的实现调用
公共无效饲料动物内部(职能回购、行动doIt)
{
var animalRepo=repo();
var-animalRepo.GetAnimals();//可能是长颈鹿或其他动物
foreach(动物中的动物变量){doIt(动物);}
}

首先,为什么Func(第一个)不能编译?这是协方差吗?接下来,你知道我怎样才能完成类似于我正在尝试做的事情吗?

是的,这是一个协方差问题。如果您这样定义
IMammalRepository

public interface IMammalRepository<out T> where T : IMammal
{
    // ...
}
公共接口IMammal存储库,其中T:IMammal
{
// ...
}

这会解决你的问题。

是的,这是一个协方差问题。如果您这样定义
IMammalRepository

public interface IMammalRepository<out T> where T : IMammal
{
    // ...
}
公共接口IMammal存储库,其中T:IMammal
{
// ...
}

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

查看Eric Lippert的博客。我想这是一个由十部分组成的系列。

请查看Eric Lippert在上的博客。我想这是一个由十部分组成的系列。

是的。我需要阅读更多关于协方差和逆方差的内容。谢谢,是的。我需要阅读更多关于协方差和逆方差的内容。谢谢