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; }
}
Можно ли это достичь? Если нет, то почему?
Поскольку '' IEnumerable не соответствует точной подписи ожидаемый интерфейс. Вы не можете выполнять ковариантную подстановку для интерфейса. Вы можете сделать что-то вроде 'ICage где T: Animal', тогда пусть это будет' IEnemurable Животные {get; } ' –
willaien
@willaien, поэтому реализации интерфейса всегда должны быть точными совпадениями? Есть ли веская причина для этого? –
@stuartd Но обезьяны - животные. В любом случае, я думаю, что сам нашел ответ: http://stackoverflow.com/a/7996843/4961688 –