非靜態的字段、方法或屬性 要求對象引用的一種特殊情況


---恢復內容開始---

廢話少說

 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     }

編譯通過。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM