c# 命名迭代器

classProgram{staticvoidMain(string[]args){Class1c=newClass1();foreach(intiinc.MaxToMi... 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遍历了?谢谢!
展开
 我来答
zechac
2013-10-24 · TA获得超过161个赞
知道答主
回答量:84
采纳率:0%
帮助的人:55.7万
展开全部
你foreach的不是类class1
而是class1的MaxToMin()
MaxToMin的返回值是IEnumerable 当然可以了。

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

这个Class1和Class1:IEnumerable的区别?

追答
实现接口IEnumerator或声明 GetEnumerator 方法都可以。。。上面我错了,不要被误导。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
handangaoyang
2013-10-24 · TA获得超过2242个赞
知道大有可为答主
回答量:2633
采纳率:88%
帮助的人:915万
展开全部

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


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

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

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

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


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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
清水栞
2013-10-24 · TA获得超过1547个赞
知道小有建树答主
回答量:1538
采纳率:50%
帮助的人:982万
展开全部
foreach的对象是IEnumerable类型的,你的MaxToMin返回的就是这个类型,所以就可以被遍历了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式