Я пытаюсь реализовать 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, но я понятия не имею, почему.