---恢复内容开始---

废话少说

 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     }

编译通过。