在.NET中 只有实现了IEnumerator 和 IEnumerable 两个接口的类型才能使用foreach进行迭代.
其原因是: 编译器 在将foreach 编译成MSIL语言之前 会将我们的foreach代码编译成下面的这种形式
//我们写的原始的代码
int[] intArr = [1,2,3,4,5,6,7];
foreach(int i in intArr)
{
Console.WriteLine(i);
}
//编译器转换过后的代码(请注意 ,我这里说的是转换 而不是编译.编译是指将C#编译成MSIL)
IEnumerator enum = intArr.GetEnumerator();
while(enum.MoveNext())
{
Console.WriteLine(i);
}
//它调用了 int数组集合的GetEnumerator方法. 并返回了一个 IEnumerator 类型的接口对象.
这里面还有很多细节.我赘述了.
数组和集和 之后能使用 foreach进行迭代 是因为 它们已经默认实现了 IEnumerator 和 IEnumerable 接口.
如果你想让自己的类型也能使用foreach进行迭代 ,那么也需要实现这两个接口.(姑且这么认为吧/.)
|