如何在接口实现中实现IEnumerable <animal>作为IEnumerable <monkey>(协方差)

时间:2016-03-07 15:14:23

标签: c# interface ienumerable covariance

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

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

如果Monkey来自Animal

为什么我不允许做以下事情?

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

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

有可能实现这一目标吗?如果没有,为什么?

1 个答案:

答案 0 :(得分:0)

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

Eric Lippert在这篇文章中可以找到关于为什么会出现这种情况的一些信息: https://stackoverflow.com/a/7996843/4961688