我读到了 IEnumerable:
IEnumerable or IEnumerable<T> : by implementing this an object states that it can give you an iterator that you can use to traverse over the sequence/collection/set
那么,该foreach
语句仅使用IEnumerable
接口来迭代集合吗?
或者它也使用IEnumerator
?
我读到了 IEnumerable:
IEnumerable or IEnumerable<T> : by implementing this an object states that it can give you an iterator that you can use to traverse over the sequence/collection/set
那么,该foreach
语句仅使用IEnumerable
接口来迭代集合吗?
或者它也使用IEnumerator
?
IEnumerable 公开了一个方法,该方法返回一个 IEnumerator。所以,答案是:两者都用。
IEnumerator 不公开 GetEnumerator 因此 foreach 将引发错误。
IEnumerable numbers = new[]{1,2,3,4,5};
foreach(var number in numbers) //finds GetEnumerator()
{
Console.WriteLine(number);
}
IEnumerator numbers2 = new[]{1,2,3,4,5}.GetEnumerator();
foreach(var number in numbers2) //cannot find GetEnumerator, throws
{
Console.WriteLine(number);
}
第二个 foreach 将引发错误,因为 foreach 专门寻找未在 IEnumerator 上公开的 GetEnumerator 方法。
如果你看一下 IEnumerable 接口,你会发现它唯一的方法就是让 IEnumerator 进行迭代。