2012-01-06 21 views
26

Tôi đang cố gắng thực hiện Danh sách Danh sách của riêng mình (đơn giản). Đây là những gì tôi đã làm cho đến nay:Việc triển khai thực hiện các tính năng IEnumerable <T>

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace provaIEnum 
{ 
    class MyList<T> : IEnumerable<T> 
    { 
     private T[] _array; 
     public int Count { get; private set; } 

     public MyList() { /* ... */ } 
     public void Add(T element) { /* ... */ } 

     // ... 

     public IEnumerator<T> GetEnumerator() 
     { 
      for (int i = 0; i < Count; i++) 
       yield return _array[i]; 
     } 
    } 

Tôi nhận được một lỗi về GetEnumerator mặc dù:

'provaIEnum.Lista' không thực hiện giao diện thành viên 'System.Collections.IEnumerable.GetEnumerator() '. 'provaIEnum.Lista.GetEnumerator()' không thể triển khai 'System.Collections.IEnumerable.GetEnumerator()' bởi vì nó không có kiểu trả về phù hợp của 'System.Collections.IEnumerator'.

Tôi không chắc liệu tôi có hiểu VS đang cố gắng nói với tôi hay không và tôi không biết cách khắc phục.

Cảm ơn thời gian của bạn

+0

Lưu ý rằng bạn không nên viết điều tra viên của bạn như vậy vì hiện tại bạn có thể sửa đổi mảng nội bộ của bạn trong 'foreach' (gọi' Add' trong foreach sẽ không gây ra ngoại lệ). [Xem] (http://stackoverflow.com/questions/24142614/when-should-i-separately-implement-ienumeratort) – nawfal

+0

@nawfal điểm tốt, lỗi luôn xem chúng tôi;) – BlackBear

Trả lời

41

Kể từ IEnumerable<T> cụ IEnumerable bạn cần phải thực hiện giao diện này cũng như trong lớp học của bạn trong đó có phiên bản không-chung của phương pháp GetEnumerator. Để tránh xung đột, bạn có thể thực hiện nó một cách rõ ràng:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    // call the generic version of the method 
    return this.GetEnumerator(); 
} 

public IEnumerator<T> GetEnumerator() 
{ 
    for (int i = 0; i < Count; i++) 
     yield return _array[i]; 
} 
+1

Cảm ơn bạn, tôi không biết IEnumerable thực hiện IEnumerable (mặc dù nó có vẻ rõ ràng: P) – BlackBear

+5

Vì bạn chưa đủ điều kiện 'IEnumerator' và' IEnumerable.GetEnumerator' với 'System.Collections.', điều này sẽ thất bại nếu bạn không có' using System.Collections' , nói (khá vô ích) rằng 'IEnumerator' cần một đối số chung! – PJTraill

10

Bạn sẽ cần phải thực hiện các phương pháp GetEnumerator phi chung cũng như:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return GetEnumerator(); 
} 

Kể từ khi giao diện IEnumerable<T> kéo dài IEnumerable, bạn phải thực hiện các phương thức được khai báo trên cả hai.

+0

Triển khai giao diện rõ ràng không được có công cụ sửa đổi truy cập – Nuffin

36

Đọc thông báo lỗi cẩn thận hơn; nó nói cho bạn biết chính xác những gì bạn phải làm. Bạn không triển khai System.Collections.IEnumerable.GetEnumerator.

Khi bạn triển khai chungIEnumerable<T>, bạn cũng phải triển khai công cụ đếm số đếm của System.Collections.IEnumerable.

Cách thông thường để làm như vậy là:

public IEnumerator<T> GetEnumerator() { whatever } 
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
{ 
    return this.GetEnumerator(); 
} 
+0

+1 cho 'cách tiêu chuẩn', tiếp tục học mỗi ngày :) – BlackBear

4

Thêm phương pháp sau đây:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return this.GetEnumerator(); 
} 
2

Có hai định nghĩa chồng cho GetEnumerator() mà bạn phải thực hiện. Một số xuất phát từ số IEnumerable<T> và trả lại IEnumerator<T>. Người kia đến từ IEnumerable và trả về IEnumerator. Ghi đè nên xem xét như thế này:

IEnumerator IEnumerable.GetEnumerator()

Điều này là do thực hiện IEnumerable<T>IEnumerable.

1

Kể từ khi lớp học của bạn, MyList<T> thừa hưởng IEnumerable<out T> mà lần lượt được thừa hưởng các phi generic IEnumerable, bạn có hai phương pháp bạn cần phải thực hiện:

IEnumerator<T> IEnumerable<T>.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

Một cách dễ dàng để làm điều này là khi bạn khai báo lớp học của bạn:

class MyList<T> : IEnumerable<T> 

nhấp chuột phải vào văn bản IEnumerable<T> và chọn Thực hiện giao diện> Thực hiện giao diện explictly từ menu ngữ cảnh.

0

Tôi gặp vấn đề tương tự, mặc dù tôi cũng đã triển khai IEnumerable và IEnumerable. Tôi đã sử dụng loại tùy chỉnh (lớp Person) so với loại chung T. Đối với tôi lý do là, không gian tên không được bao gồm trong phần đầu của tệp.

using System.Collections; 

Sau khi thêm không gian tên thì tốt cho tôi.

Các vấn đề liên quan