---恢復內容開始---
廢話少說
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 }
編譯通過。