2016-03-07 77 views
1

IEnumerable<T>是协变的IEnumerable IEnumerable 。这意味着,我被允许做 如何在接口实现(协方差)

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

如果MonkeyAnimal派生。

但是为什么我不被允许进行以下操作?

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

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

有没有可能做到这一点?如果不是,为什么?

+6

因为'IEnumerable的'不匹配接口预期确切的签名。你不能做一个接口的协变替换。你可以做一些像'ICage 其中T:Animal',然后它是'IEnemurable Animals {get; }' – willaien

+0

@willaien所以接口的实现总是必须精确匹配?这是否有很好的理由? –

+0

@stuartd但猴子是动物。无论如何,我想我自己找到了答案:http://stackoverflow.com/a/7996843/4961688 –

回答

0

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

上为什么是这样的情况下,可以在这个岗位由埃里克利珀被发现的一些信息: https://stackoverflow.com/a/7996843/4961688