如何在接口实现中将 IEnumerable<Animal> 实现为 IEnumerable<Monkey>(协方差)

How to implement IEnumerable<Animal> as IEnumerable<Monkey> in an interface implementation (covariance)

IEnumerable<T> 是协变的。这意味着我可以做

IEnumerable<Animal> Animals = new List<Monkey>()

如果 Monkey 来自 Animal.

为什么不允许我执行以下操作?

interface ICage
{
    IEnumerable<Animal> Animals { get; }
}

class MonkeyCage : ICage
{
    IEnumerable<Monkey> Animals { get; }
}

有可能实现吗?如果不是,为什么?

这是不可能的,因为 C# 中的接口实现必须与接口中定义的确切签名匹配。

可以在 Eric Lippert 的 post 中找到有关为什么会出现这种情况的一些信息: