2010-06-05 36 views
8

Tôi nhận được thông báo lỗi này và tôi không thể hiểu tại sao!Thông báo lỗi liên quan đến IEnumerable.GetEnumerator()

Error 1 'Exo5Chap12.ShortCollection<T>' does not implement interface member 
'System.Collections.IEnumerable.GetEnumerator()'. 
'Exo5Chap12.ShortCollection<T>.GetEnumerator()' cannot implement 
'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching 
return type of 'System.Collections.IEnumerator'.  
E:\MyFolders\Dev\c#\Chapter12\Exo5Chap12\Exo5Chap12\exo5.cs 9 18 Exo5Chap12 

Đây là mã có triển khai GetEnumerator(). Có gì sai?

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 
    public IEnumerator<T> GetEnumerator() 
    { 
     return (innerCollection as IEnumerator<T>).GetEnumerator(); 
    } 
} 
+0

Đơn giản chỉ cần không bỏ đối tượng innerCollection, cho cả triển khai thực hiện IEnumerable và IEnumerable. Xem mã đầy đủ của tôi trong câu trả lời được đăng bên dưới ... – code4life

+1

Tôi nhận thấy rằng thông báo lỗi cho bạn biết chính xác * điều gì đang xảy ra ở đây: IEnumerable chưa được triển khai, yêu cầu phải được triển khai và phương pháp duy nhất có thể triển khai nó có kiểu trả về sai. Điều đó đã thực hiện một phân tích lỗi phức tạp và chưa đủ để cho phép bạn tự chẩn đoán vấn đề. Một thông báo lỗi khác có hữu ích hơn không? Loại thông báo lỗi nào đã cho phép bạn chẩn đoán sự cố mà không yêu cầu trợ giúp? –

+0

Tôi là một newbie và đang đọc sách Wrox (người mới bắt đầu) Visual C#. Tôi không biết rằng tôi đã phải thực hiện cả IEnumerable và IEnumerable , vì nó thậm chí không được đề cập trong cuốn sách. Cộng với mã đó là câu trả lời của bài tập (tự hỏi liệu họ đã kiểm tra mã trước khi in ra). Tôi đã xem trang web msdn và diễn đàn wrox nhưng họ cũng không đề cập đến nó. Tôi phải nói IEnumerable là khá khó khăn cho tôi để tìm hiểu. Nhưng bây giờ tôi đã đọc lỗi một lần nữa, tôi đồng ý rằng có ý nghĩa. –

Trả lời

4

IEnumerableIEnumerable<T> là giao diện khác nhau và mã của bạn phải thực hiện cả hai. Mã của bạn chỉ thực hiện GetEnumerator() của IEnumerable<T>, nhưng không phải là GetEnumerator() của IEnumerable. Bạn nên cân nhắc việc cài đặt ReSharper giúp dễ dàng sửa lỗi như thế này.

+0

+1 cho Resharper (R #) ... nó khá tuyệt vời. –

+0

Joel, cảm ơn bạn đã chỉnh sửa. Tôi tìm tài liệu về các tùy chọn định dạng ở đâu? – Achim

+0

dấu chấm hỏi màu cam phía trên vùng văn bản. – wRAR

3

Bạn cần phải thực hiện một vài điều nữa:

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 

    #region IList<T> Members 

    public int IndexOf(T item) 
    { 
     return innerCollection.IndexOf(item); 
    } 

    public void Insert(int index, T item) 
    { 
     innerCollection.Insert(index, item); 
    } 

    public void RemoveAt(int index) 
    { 
     innerCollection.RemoveAt(index); 
    } 

    public T this[int index] 
    { 
     get 
     { 
      return innerCollection[index]; 
     } 
     set 
     { 
      innerCollection[index] = value; 
     } 
    } 

    #endregion 

    #region ICollection<T> Members 

    public void Add(T item) 
    { 
     innerCollection.Add(item); 
    } 

    public void Clear() 
    { 
     innerCollection.Clear(); 
    } 

    public bool Contains(T item) 
    { 
     return innerCollection.Contains(item); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     innerCollection.CopyTo(array, arrayIndex); 
    } 

    public int Count 
    { 
     get { return innerCollection.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return false; } 
    } 

    public bool Remove(T item) 
    { 
     return innerCollection.Remove(item); 
    } 

    #endregion 

    #region IEnumerable<T> Members 

    public IEnumerator<T> GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    #endregion 

    #region IEnumerable Members 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

    #endregion 
} 

Mã này sẽ biên dịch ... :)

+0

Cảm ơn bạn rất nhiều! –

12

Như những người khác đã nói, bạn cần phải thực hiện IEnumerable cũng như IEnumerable<T>. Tuy nhiên, vì bản thân IEnumberable<T> implemets IEnumerable này là tầm thường, chỉ cần gọi bạn chung GetEnumerator():

public class ShortCollection<T> : IList<T> 
{ 
    protected Collection<T> innerCollection; 
    protected int maxSize = 10; 
    public IEnumerator<T> GetEnumerator() 
    { 
     return innerCollection.GetEnumerator(); 
    } 

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

Tôi giả định rằng bạn có phương pháp để thực sự thêm và loại bỏ từ innerCollection và chỉ để lại cho họ ra cho ngắn gọn vì họ didn không liên quan đến câu hỏi trong tầm tay.

+0

Cảm ơn bạn rất nhiều! Có, tôi để phần còn lại ra ngoài. Cảm ơn một lần nữa! –

+0

Đây là câu trả lời tốt hơn nhiều so với câu trả lời được chọn là chính xác vì nó chứa một ví dụ về mã. @Bon_chan xem xét thay đổi lựa chọn của bạn. –

+0

Tôi đã dành một khoảng thời gian đáng xấu hổ để giải quyết vấn đề này. 1 cho 'IEnumerator IEnumerable.GetEnumerator() '. –

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