C# IEnumerable<;int>;还需要非泛型IEnumerator?

C# IEnumerable<;int>;还需要非泛型IEnumerator?,c#,.net,generics,ienumerable,C#,.net,Generics,Ienumerable,3个问题: 1) 为什么输出来自非通用函数 2) 为什么我也有来实现非泛型功能 3) 如果我想看到泛型函数输出(int),我需要做什么 您需要同时实现这两个功能,因为IEnumerable是从IEnumerable派生而来的。要调用显式实现的方法,需要强制转换到该接口 但是通常您显式地实现非泛型方法,隐式地实现泛型方法。这样一来,foreach将使用通用方法foreach对集合的类型使用GetEnumerator()方法,并且仅在不存在此方法时才返回到接口方法 典型的实现是: public IE

3个问题:

1) 为什么输出来自通用函数

2) 为什么我也有来实现非泛型功能

3) 如果我想看到泛型函数输出(int),我需要做什么


您需要同时实现这两个功能,因为
IEnumerable
是从
IEnumerable
派生而来的。要调用显式实现的方法,需要强制转换到该接口

但是通常您显式地实现非泛型方法,隐式地实现泛型方法。这样一来,
foreach
将使用通用方法
foreach
对集合的类型使用
GetEnumerator()
方法,并且仅在不存在此方法时才返回到接口方法

典型的实现是:

public IEnumerator<int> GetEnumerator()
{
   ...
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
  return GetEnumerator();//Forward to strongly typed version
}
public IEnumerator GetEnumerator()
{
...
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
返回GetEnumerator();//转发到强类型版本
}
  • foreach
    关键字根本不要求集合实现
    IEnumerable
    ;相反,它将调用任何已定义的
    GetEnumerator
    方法

  • 出于兼容性原因,
    IEnumerable
    实现了
    IEnumerable

  • 您应该显式实现
    IEnumerable.GetEnumerator()
    ,并让普通方法返回
    IEnumerator

  • 如果类有一个普通的
    GetEnumerator()
    方法(与显式接口实现相反),编译器将调用它。
    说明书上说:

    • 否则,确定类型X是否具有适当的GetEnumerator方法:
      • 使用标识符GetEnumerator和无类型参数对类型X执行成员查找。如果成员查找未生成匹配项, 或者它产生了歧义,或者产生了不是方法的匹配 组,检查可枚举接口,如下所述。它是 建议在成员查找产生错误时发出警告 除方法组或不匹配之外的任何内容
      • 使用生成的方法组和空参数列表执行重载解析。如果重载解析结果为“否” 适用的方法,导致歧义,或导致单一 最好的方法,但该方法要么是静态的,要么不是公共的,请检查 如下所述的可枚举接口。建议 如果重载解析产生除 明确的公共实例方法或没有适用的方法
      • [……]
    • 否则,请检查可枚举接口:
    1) 输出取自非泛型函数,因为它是隐式定义的(泛型函数是显式定义的)

    2)
    IEnumerable
    继承自
    IEnumerable
    ,因此继承自
    IEnumerable
    的任何类型也必须实现
    IEnumerable
    的成员

    3) 使泛型定义隐式,非泛型定义显式,例如

    public class Class1 : IEnumerable<int>
    {
        public IEnumerator<int> GetEnumerator()
        {
            yield return 1;
            yield return 2;
            yield return 3;
            yield return 4;
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
    }
    
    公共类Class1:IEnumerable
    {
    公共IEnumerator GetEnumerator()
    {
    收益率1;
    收益率2;
    收益率3;
    收益率4;
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
    返回此.GetEnumerator();
    }
    }
    

    请注意,您可以从非泛型方法返回泛型枚举数,因为
    IEnumerator
    继承自
    IEnumerator

    返回GetEnumerator()//Fo
    有错误:迭代器不能包含return语句…@RoyiNamir:除去
    yield
    s。其他读数:。