代码一改成这样也行,这到底是怎么回事? public IEnumerator GetEnumerator() { return this.names.GetEnumerator(); //for (int i = 0; i < names.Length; i++) //{ // yield return names[i];//返回迭代器 //} }
是这样的,如果要对一个对象使用foreach,那么它必须包含一个GetEnumerator()方法,无参数,返回类型任意,同时返回的类型必须包含Current属性和MoveNext方法。编译器会自动去绑定,因此不需要IEnumerable和IEnumerator。其实接口的本质就是让编译器去绑定一个对象的方法,在这里,C#编译器的确不依赖接口。下面的代码不使用IEnumerable和IEnumerator:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApplication1 { class Program { public class D9TecMembers { public class DefaultEnumerator { private string[] value; private int n = 0; public DefaultEnumerator(string[] value) { this.value = value; } public object Current { get { return value[n]; } } public bool MoveNext() { return ++n < value.Length; } } string[] names = { "Wei Gao", "Zhao Zhang", "Changji Song", "Zhike Chang", "Denian Zhang", "Zhaotian Yang", "Guangyue Cai" };
public DefaultEnumerator GetEnumerator() { return new DefaultEnumerator(names); } } static void Main(string[] args) { D9TecMembers titles = new D9TecMembers(); foreach (string title in titles) { Console.WriteLine(title); } } } }至于yield,则是C#编译器自动为你产生两个类,一个包含GetEnumerator,一个包含Current和MoveNext
public IEnumerator GetEnumerator()
{
return this.names.GetEnumerator();
//for (int i = 0; i < names.Length; i++)
//{
// yield return names[i];//返回迭代器
//}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{
class Program
{
public class D9TecMembers
{
public class DefaultEnumerator
{
private string[] value;
private int n = 0;
public DefaultEnumerator(string[] value) { this.value = value; }
public object Current
{
get { return value[n]; }
} public bool MoveNext()
{
return ++n < value.Length;
}
} string[] names = { "Wei Gao", "Zhao Zhang", "Changji Song", "Zhike Chang", "Denian Zhang", "Zhaotian Yang", "Guangyue Cai" };
public DefaultEnumerator GetEnumerator()
{
return new DefaultEnumerator(names);
}
} static void Main(string[] args)
{
D9TecMembers titles = new D9TecMembers(); foreach (string title in titles)
{
Console.WriteLine(title);
}
}
}
}至于yield,则是C#编译器自动为你产生两个类,一个包含GetEnumerator,一个包含Current和MoveNext
PS:详细讲解后,不要忘了推荐加精,让更多人看到。
IEnumerator:枚举器
根本不是一个东西,不能用来比较,微软的语法糖让你可以混合使用,但完全不是一个东西。
枚举数,是foreach的基本迭代器。而可枚举类型是可以返回枚举数的基础。
枚举数,是可以自己设计的,也就是说是可以自己继承后再处理的。
private int n = 0;改为private int n = -1;