class Program
{
static void Main(string[] args)
{
Class1 c = new Class1();
foreach (int i in c.MaxToMin(1, 2))
{
Console.WriteLine(i);
}
}
}
class Class1
{
// 定义一个命名的迭代器,并可以提供参数
public IEnumerable MaxToMin(int min, int max)
{
for (int i = max; i >= min; i--)
{
yield return i;
}
}
}
如上代码可以正常运行。问题是 :Class1并不是可枚举的类型,只是类的方法中定义了一个迭代器方法。为什么它就可以foreach遍历了?谢谢!
这个问题,要说清楚,也许会有点长。我试试看说不说得清楚。
IEnumerable这个接口表明,实现该接口的类,可以被迭代。而IEnumerable的接口,有一个GetEnumerator()方法,该方法返回IEnumerator接口(这个接口的作用,请看第二点)
IEnumerator这个接口表明,迭代的具体实现,这也就说明了,为什么IEnumerable接口中唯一一个GetEnumerator()方法返回IEnumerator类型。
yield这个关键字,只能用于return与break之前。这个关键字,我并不是太理解。我只能看实现,然后好像意会到这个关键字存在的意义。
IEnumerable接口,如果被一个类实现,那么这个类中必须有可以迭代的元素(元素实现了IEnumerator);如果作为一个方法的返回值,那么表示这个方法是一个迭代方法。
哎~~~,这个问题,我回答的不是很好。第四点,说出了,为什么。因为这就是IEnumerable的用法。被类实现与作为一个方法的返回值。如果想弄明白,还是推荐在msdn上面,好好研究一下IEnumerable与IEnumerator。还有就是yield,可以简化实现的过程。