Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IEnumerable.GetEnumerator()和#x27;如果GetEnumerator()是不同的返回类型,那么实现的步骤是返回GetEnumerator()?_C#_Generics_Ienumerable_Return Type_Ienumerator - Fatal编程技术网

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(); }
}