2016-03-07 2 views
1

IEnumerable<T> является ковариантным. Это означает, что я позволил сделатьКак реализовать IEnumerable <Animal> как IEnumerable <Monkey> в реализации интерфейса (ковариация)

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

если Monkey происходит от Animal.

Почему мне не разрешено делать следующее?

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

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

Можно ли это достичь? Если нет, то почему?

+6

Поскольку '' IEnumerable не соответствует точной подписи ожидаемый интерфейс. Вы не можете выполнять ковариантную подстановку для интерфейса. Вы можете сделать что-то вроде 'ICage где T: Animal', тогда пусть это будет' IEnemurable Животные {get; } ' – willaien

+0

@willaien, поэтому реализации интерфейса всегда должны быть точными совпадениями? Есть ли веская причина для этого? –

+0

@stuartd Но обезьяны - животные. В любом случае, я думаю, что сам нашел ответ: http://stackoverflow.com/a/7996843/4961688 –

ответ

0

Это невозможно, поскольку реализации интерфейса в C# должны соответствовать точной сигнатуре, определенной в интерфейсе.

Некоторая информация о том, почему это так, можно найти в этой статье Эрик Липперт: https://stackoverflow.com/a/7996843/4961688

Смежные вопросы