---恢复内容开始---
废话少说
1 class Person 2 { 3 public string Name { get; set; } 4 public int Age { get; set; } 5 public Person(string name, int age) 6 { 7 Name = name; 8 Age = age; 9 } 10 } 11 class PersonList : IEnumerable<Person> 12 { 13 List<Person> pList = new List<Person>() 14 { 15 new Person("Mike",20), 16 new Person("John",23), 17 new Person("Jack",18), 18 new Person("Tom",34) 19 }; 20 public void Add(Person person) 21 { 22 pList.Add(person); 23 } 24 public int CurrentIndex { get; set; } 25 public IEnumerator<Person> IEnumerable<Person>. GetEnumerator() 26 { 27 foreach (var p in pList) 28 { 29 CurrentIndex++; 30 yield return p; 31 } 32 } 33 IEnumerator IEnumerable.GetEnumerator() 34 { 35 return IEnumerable<Person>.GetEnumerator(); 36 } 37 }
结果编译失败,提示“非静态的字段、方法或属性 要求对象引用的一种特殊情况”。大家可能觉得我写的代码优点奇怪,主要原因是IEnumerable<T>有一个GetEnumerator()方法,而它由继承了IEnumerable接口,该接口又有一个GetEnumerator()方法,所以我要实现两个GetEnumerator()方法,当然它们的返回类型不同。我自作聪明地像上面那样写代码。那问题出在哪儿呢?
问题出在地35行,由于IEnumerable<Person>不是一个静态方法,又没有实例化,所以提示以上错误。改为
1 class Person 2 { 3 public string Name { get; set; } 4 public int Age { get; set; } 5 public Person(string name, int age) 6 { 7 Name = name; 8 Age = age; 9 } 10 } 11 class PersonList : IEnumerable<Person> 12 { 13 List<Person> pList = new List<Person>() 14 { 15 new Person("Mike",20), 16 new Person("John",23), 17 new Person("Jack",18), 18 new Person("Tom",34) 19 }; 20 public void Add(Person person) 21 { 22 pList.Add(person); 23 } 24 public int CurrentIndex { get; set; } 25 public IEnumerator<Person> GetEnumerator() 26 { 27 foreach (var p in pList) 28 { 29 CurrentIndex++; 30 yield return p; 31 } 32 } 33 IEnumerator IEnumerable.GetEnumerator() 34 { 35 return GetEnumerator(); 36 } 37 }
编译通过。