首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEnumerable<int>还需要非泛型IEnumerator吗?

IEnumerable<int>还需要非泛型IEnumerator吗?
EN

Stack Overflow用户
提问于 2011-11-27 14:36:08
回答 3查看 3.6K关注 0票数 14

3个问题:

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

2)为什么我也有来实现非泛型函数?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-27 14:38:45

methods.

  • IEnumerable<T>关键字
  1. foreach关键字根本不需要集合来实现IEnumerable;相反,出于兼容性的原因,它将调用任何定义的GetEnumerator foreach实现IEnumerable

如果类有一个普通的GetEnumerator()方法(相对于显式接口实现),编译器将调用它。

说明书上写着:

否则,请确定类型X是否具有适当的方法:

  • 使用标识符GetEnumerator对类型X执行成员查找,而不使用类型参数。如果成员查找不产生匹配,或产生歧义,或生成不属于方法组的匹配,请检查是否有如下所述的可枚举接口。如果成员查找产生任何结果,则建议发出警告,除非使用生成的方法组和空参数列表生成方法组或没有match.
  • Perform重载解析。如果重载解析导致不适用的方法,导致歧义,或导致单一的最佳方法,但该方法要么是静态的,要么不是公共的,请检查是否有如下所述的可枚举接口。建议在重载解析产生除明确的公共实例方法或不适用的methods.
  • ...

以外的任何内容时,应发出警告。

否则,请检查可枚举接口:

票数 10
EN

Stack Overflow用户

发布于 2011-11-27 14:48:05

1)输出来自非泛型函数,因为它是隐式定义的(而泛型函数是显式定义的)。

2) IEnumerable<T>继承自IEnumerable,因此从IEnumerable<T>继承的任何类型都必须实现IEnumerable的成员

3)使泛型定义和非泛型定义显式化。

代码语言:javascript
复制
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();
    }
}

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

票数 7
EN

Stack Overflow用户

发布于 2011-11-27 14:38:36

您需要实现这两种方法,因为IEnumerable<T>是从IEnumerable派生的。要调用显式实现的方法,需要强制转换到该接口。

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

典型的实施是:

代码语言:javascript
复制
public IEnumerator<int> GetEnumerator()
{
   ...
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
  return GetEnumerator();//Forward to strongly typed version
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8286289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档