Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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# foreach是否对内置类型使用IEnumerator/IEnumerable?_C#_.net_Interface_Foreach_Enumerators - Fatal编程技术网

C# foreach是否对内置类型使用IEnumerator/IEnumerable?

C# foreach是否对内置类型使用IEnumerator/IEnumerable?,c#,.net,interface,foreach,enumerators,C#,.net,Interface,Foreach,Enumerators,foreach循环是否仅将接口IEnumerator和IEnumerable用于迭代自定义类型(类)的对象或也用于迭代内置类型(幕后)?foreach本身并不依赖于IEnumerable。然而,如果一个类型实现了它,那么foreach循环将能够枚举它(基于模式的匹配) 在幕后,它只需要一个GetEnumerator()方法,并且枚举器必须包含Current和MoveNext() 从MSDN: 集合类型: 必须是以下类型之一:接口、类或结构 必须包含一个名为GetEnumerator的实例方法

foreach循环是否仅将接口
IEnumerator
IEnumerable
用于迭代自定义类型(类)的对象或也用于迭代内置类型(幕后)?

foreach本身并不依赖于
IEnumerable
。然而,如果一个类型实现了它,那么foreach循环将能够枚举它(基于模式的匹配)

在幕后,它只需要一个
GetEnumerator()
方法,并且枚举器必须包含
Current
MoveNext()

从MSDN:

  • 集合类型:

    • 必须是以下类型之一:接口结构
    • 必须包含一个名为GetEnumerator的实例方法,该方法返回一个类型,例如
      Enumerator
      (解释如下)
  • 类型
    枚举器(类或结构)必须包含:

    • 名为Current的属性,返回
      ItemType
      或可转换为它的类型。属性访问器返回集合的当前元素
    • 一种bool方法,名为MoveNext,如果集合中有更多项,则递增项计数器并返回true


已更新:请参阅更新的MSDN页面以了解此-。

foreach对本机和自定义类型都使用IEnumerable。例如,如果您查看System.Array,它是所有数组类型的基础,它为每个is语言构造实现IEnumerable.

,实际上并不区分自定义/内置类型


对于每个不依赖于
IEnumerable
,它使用基于模式的匹配。请参见定义枚举器,无IEnumerable声明

public class WorkInfoEnumerator
{
  List<WorkItem > wilist= null;
  int currentIndex = -1;


  public MyClassEnumerator(List<WorkItem > list)
  {
     wilist= list;
  }

  public WorkItem Current
  {
     get
     {
         return wilist[currentIndex];
     }
  }

  public bool MoveNext()
  {
     ++currentIndex;
     if (currentIndex < wilist.Count)
         return true;
     return false;
  }   
}


public class WorkInfo
{
    List<WorkItem > mydata = new List<WorkItem >();
    public WorkInfoEnumerator GetEnumerator()
    {
        return new WorkInfoEnumerator(mydata);
    }
}

foreach文档:更新的MSDN文档页(用于VS 2012而不是VS.NET 2003):
WorkInfo wi = new WorkInfo();
foreach(WorkItem witem in wi) 
{  
}