C# IEnumerable.GetEnumerator()和#x27;如果GetEnumerator()是不同的返回类型,那么实现的步骤是返回GetEnumerator()?
我试图理解为什么C# IEnumerable.GetEnumerator()和#x27;如果GetEnumerator()是不同的返回类型,那么实现的步骤是返回GetEnumerator()?,c#,generics,ienumerable,return-type,ienumerator,C#,Generics,Ienumerable,Return Type,Ienumerator,我试图理解为什么 类Foo:IEnumerable { 公共IEnumerator GetEnumerator() { //.... } IEnumerator IEnumerable.GetEnumerator() { 返回GetEnumerator(); } } 不是编译器错误GetEnumerator()返回IEnumerator,而IEnumerable.GetEnumerator()应该返回IEnumerator,但它返回的是通用版本,即IEnumerator,因为它只返回GetEn
类Foo:IEnumerable
{
公共IEnumerator GetEnumerator()
{
//....
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
不是编译器错误
GetEnumerator()
返回IEnumerator
,而IEnumerable.GetEnumerator()
应该返回IEnumerator
,但它返回的是通用版本,即IEnumerator
,因为它只返回GetEnumerator()代码>。因此,显然不同的回报类型。我在这里遗漏了什么?正如评论中指出的那样,IEnumerator
实现了IEnumerator
,因此本质上,IE
“是一个”IE
。如果我们这样做,可能更容易看到,这很好:
class Foo : IEnumerable<int>
{
private IEnumerator<int> x;
public IEnumerator<int> GetEnumerator()
{
return x;
}
IEnumerator IEnumerable.GetEnumerator()
{
return x;
}
}
…你甚至不会对此提出质疑:)请看。泛型IEnumerable
实现非泛型IEnumerable
,因此前者是后者的子类型。声明为
class Foo : IEnumerable<int>
{
private IEnumerator x;
public IEnumerator<int> GetEnumerator()
{
return x;
}
IEnumerator IEnumerable.GetEnumerator()
{
return x;
}
}
class Lion:IAnimal{}
class Zoo{
Lion GetLion() { }
IAnimal GetAnimal() { return GetLion(); }
}