c# 命名迭代器

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遍历了?谢谢!

第1个回答  2013-10-24
你foreach的不是类class1
而是class1的MaxToMin()
MaxToMin的返回值是IEnumerable 当然可以了。

若要foreach类class1 必须继承IEnumerable 才对,
然后foreach( var v in c)。追问

这个Class1和Class1:IEnumerable的区别?

追答

实现接口IEnumerator或声明 GetEnumerator 方法都可以。。。上面我错了,不要被误导。

第2个回答  2013-10-24

这个问题,要说清楚,也许会有点长。我试试看说不说得清楚。


    IEnumerable这个接口表明,实现该接口的类,可以被迭代。而IEnumerable的接口,有一个GetEnumerator()方法,该方法返回IEnumerator接口(这个接口的作用,请看第二点)

    IEnumerator这个接口表明,迭代的具体实现,这也就说明了,为什么IEnumerable接口中唯一一个GetEnumerator()方法返回IEnumerator类型。

    yield这个关键字,只能用于return与break之前。这个关键字,我并不是太理解。我只能看实现,然后好像意会到这个关键字存在的意义。

     IEnumerable接口,如果被一个类实现,那么这个类中必须有可以迭代的元素(元素实现了IEnumerator);如果作为一个方法的返回值,那么表示这个方法是一个迭代方法。


哎~~~,这个问题,我回答的不是很好。第四点,说出了,为什么。因为这就是IEnumerable的用法。被类实现与作为一个方法的返回值。如果想弄明白,还是推荐在msdn上面,好好研究一下IEnumerable与IEnumerator。还有就是yield,可以简化实现的过程。

第3个回答  2013-10-24
foreach的对象是IEnumerable类型的,你的MaxToMin返回的就是这个类型,所以就可以被遍历了本回答被提问者采纳
相似回答
大家正在搜