IEnumerable <int>还需要非通用的IEnumerator吗?

Roy*_*mir 11 .net c# generics ienumerable

3个问题:

1)为什么输出来自NON泛型函数?

2)为什么我必须实现ALON非通用功能?

3)如果我想看到通用函数输出(int的),我该怎么办?

在此输入图像描述

SLa*_*aks 8

  1. foreach关键字不需要集合来实现IEnumerable在所有; 相反,它会调用任何已定义的GetEnumerator方法.

  2. IEnumerable<T>实现IEnumerable兼容性原因.

  3. 您应该IEnumerable.GetEnumerator()显式实现并返回普通方法IEnumerator<T>.

如果类具有普通GetEnumerator()方法(而不是显式接口实现),则编译器将调用它.
规范说:

  • 否则,确定类型X是否具有适当的GetEnumerator方法:
    • 使用标识符GetEnumerator对类型X执行成员查找,而不使用类型参数.如果成员查找不产生匹配,或者产生歧义,或产生不是方法组的匹配,请检查可枚举接口,如下所述.如果成员查找产生除方法组或不匹配之外的任何内容,建议发出警告.
    • 使用生成的方法组和空参数列表执行重载解析.如果重载决策导致没有适用的方法,导致歧义,或导致单个最佳方法但该方法是静态的或不公开的,请检查可枚举的接口,如下所述.如果重载决策产生除明确的公共实例方法或没有适用的方法之外的任何内容,建议发出警告.
    • [...]
  • 否则,请检查可枚举的接口:


Ada*_*lph 6

1)输出取自非泛型函数,因为它是隐式定义的(并且通用函数是明确定义的).

2)IEnumerable<T>继承自IEnumerable,所以继承的任何类型IEnumerable<T>也必须实现成员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();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以从非泛型方法返回泛型枚举器,因为IEnumerator<T>继承自IEnumerator.