【发布时间】:2016-05-07 02:45:41
【问题描述】:
我正在尝试在派生自已实现IEnumerable<Animal> 的基类的类中实现IEnumerable<Turtle>。
为什么在类 Turtle 的任何方法中调用 base.Cast<Turtle>()(或基元素上的任何 LINQ 方法)都无法编译?
不可能用this 替换base,因为它显然会导致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,但我不知道为什么。
【问题讨论】:
-
这应该如何工作?这些是不同的类 - TurtleEnumerable 不会以任何方式从 Turtle 继承,它只是实现接口 IEnumerable
-
TurtleEnumerable 确实继承自 AnimalEnumerable 类,因此它应该可以访问基本元素。
标签: c# inheritance interface ienumerator