110,567
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace yield_learn
{
public class person : System.Collections.IEnumerable
{
#region IEnumerable
public string x = "cc";
public System.Collections.IEnumerator GetEnumerator()
{
yield return "1";
Thread.Sleep(3000);
yield return "2";
Thread.Sleep(3000);
yield return "3";
Thread.Sleep(3000);
yield return "4";
Thread.Sleep(3000);
yield return "5";
Thread.Sleep(3000);
yield return "6";
}//是如何选择遍历哪个的??
public System.Collections.IEnumerator getnum()
{
yield return "dshdjs";//为什么没有输出这个??
}
#endregion
}
class Program
{
static void Main(string[] args)
{
person arrperson = new person();
foreach (string s in arrperson)//遍历一个类中的string吗,必须带有System.Collections.IEnumerator的才遍历,但是为什么第二个不遍历呢?
{
System.Console.WriteLine(s);
}
System.Console.ReadLine();
}
}
}
public class person
{
public A getnum()
{
return new A();
}
}
public class A
{
public System.Collections.IEnumerator GetEnumerator()
{
yield return "dshdjs";//为什么没有输出这个??
}
}
这可以支持 foreach (string s in arrperson.getnum()) 操作[/quote]
这是有历史原因的,为了支持数组等运行时添加扩展方法的类,不得已违背了接口的模式,但是通过接口来定义能更加清晰自己必须要实现的方法。public class person
{
public A getnum()
{
return new A();
}
}
public class A
{
public System.Collections.IEnumerator GetEnumerator()
{
yield return "dshdjs";//为什么没有输出这个??
}
}
这可以支持 foreach (string s in arrperson.getnum()) 操作
person arrperson = new person();
System.Console.WriteLine(arrperson.x);
foreach (string s in arrperson)
{
System.Console.WriteLine(s);
}
foreach (string s in arrperson.getnum())
{
System.Console.WriteLine(s);
}
System.Console.ReadLine();