2016-03-07 56 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