在IEnumerable <T>的上下文之外使用协方差

man*_*u08 4 c# inheritance covariance

可能重复:
C#是否支持返回类型协方差?
为什么我不能这样实现接口?

考虑以下:

public interface IAnimal {
}

public class Animal : IAnimal {
}

public interface ICage {
     IAnimal SomeAnimal {get;}
}

public class Cage : ICage{
     public Animal SomeAnimal { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了很多关于IEnumerable的协方差和逆变的东西,但我不知道如何让上面的代码工作.我收到错误"Cage没有实现接口成员IAnimal".既然它定义了动物,它比IAnimal更明确,似乎协方差应该照顾我.

我错过了什么?提前致谢.

Ser*_*rvy 6

目前在C#中无法实现.

从理论上讲,语言设计师可以添加它,但它们还没有.他们可能会也可能不会决定将其添加到潜在的未来版本的C#中.

最好的解决方法可能是:

public class Cage : ICage
{
    public Animal SomeAnimal { get; set; }

    IAnimal ICage.SomeAnimal
    {
        get { return SomeAnimal }
    }
}
Run Code Online (Sandbox Code Playgroud)