Я пытаюсь реализовать IEnumerable<Turtle>
в классе, полученном из базового класса, который уже реализует IEnumerable<Animal>
.
Почему вызов base.Cast<Turtle>()
(или любой метод LINQ в базовом элементе) в любом методе из класса Turtle
не скомпилируется?
Невозможно заменить base
на this
, поскольку это, очевидно, приводит к StackOverflowException
.
Вот пример минимального кода для репликации проблемы:
public interface IAnimal {}
public class Animal : IAnimal {}
public class Turtle : Animal {}
public class AnimalEnumerable : IEnumerable<Animal> {
List<Animal> Animals = new List<Animal>();
IEnumerator<Animal> IEnumerable<Animal>.GetEnumerator() {
return Animals.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return Animals.GetEnumerator();
}
}
public class TurtleEnumerable : AnimalEnumerable, IEnumerable<Turtle> {
IEnumerator<Turtle> IEnumerable<Turtle>.GetEnumerator() {
return base.Cast<Turtle>().GetEnumerator(); //FAILS WITH "CANNOT RESOLVE SYMBOL Cast"
}
}
По какой-то причине замена base.Cast<Turtle>().GetEnumerator();
на this.OfType<Animal>().Cast<Turtle>().GetEnumerator();
работает, не бросая StackOverflowException
, но я понятия не имею, почему.