2014-03-24 92 views
1

我一直在IEnumorator中試圖建立一個允許我使用foreach語句快速插入從JSON格式化字符串中提取的大量行到這些嵌套對象中。 Applines類專門由String Get/Set語句組成。實現IEnumerator/IEnumerable與IDispose錯誤

出於某種原因,我收到三個指向類頭的錯誤。我無法理解 a)爲什麼以及如何實現IDisposable b)爲什麼要讓編譯器不同意我的返回類型。

'AppAnnieImport'沒有實現接口成員'System.Collections.IEnumerable.GetEnumerator()'。 'AppAnnieImport.GetEnumerator()'不能實現'System.Collections.IEnumerable.GetEnumerator()',因爲它沒有匹配的返回類型'System.Collections.IEnumerator'。

'AppAnnieImport' 不實現接口成員 'System.IDisposable.Dispose()'

'AppAnnieImport' 不實現接口成員 'System.Collections.Generic.IEnumerator.Current'。 'AppAnnieImport.Current'無法實現'System.Collections.Generic.IEnumerator.Current',因爲它沒有匹配的返回類型'AppLines'。

public class AppAnnieImport : IEnumerator<AppLines>, IEnumerable<AppLines> 
{ 
    public int code { get; set; } 
    public DateTime end_date { get; set; } 
    public string vertical { get; set; } 
    public string granularity { get; set; } 
    public string device { get; set; } 
    public List<AppLines> AppLine { get; set; } 
    private int position; 

    //IEnumerator and IEnumerable require these methods. 
    public IEnumerator<AppLines> GetEnumerator() 
    { 
     return (IEnumerator<AppLines>)this; 
    } 

    //IEnumerator 
    public bool MoveNext() 
    { 
     position++; 
     return (position < AppLine.Count); 
    } 

    //IEnumerable 
    public void Reset() 
    { position = 0; } 

    //IEnumerable 
    public object Current 
    { 
     get { return (AppLine.ToArray())[position] ; } 
    } 

} 
+0

將光標放在'的IEnumerator ',然後按Ctrl +。並選擇實現接口。基本上你需要實現泛型和非泛型版本的'GetEnumerator'。 –

+0

沒有什麼可以增加編譯器對問題的解釋。 –

+0

我不會讓IEnumerable和IEnumerator這兩個類都實現IEnumerable,如果你需要一個自定義的IEnumerator,使它成爲一個單獨的類。 –

回答

2

IEnumerator<T> inherits from IDisposable,所以你必須實現它也並提供Dispose方法。

IEnumerator<T>繼承自IEnumerator,所以你必須實現它,並提供返回IEnumeratorGetEnumerator()函數。

IEnumerator<T> defines a property Current which returns a T,所以你必須執行一個。


我猜的混亂源於一個事實,即從非通用版本(IEnumerableIEnumerator)通用IEnumerable<T>IEnumerator<T>繼承,要求實現與名稱相同,但不同的返回值類型的方法;而IEnumerator<T>繼承自IDisposableIEnumerator沒有。


那麼,到底,你的類應該是這個樣子

public class AppAnnieImport : IEnumerator<AppLines>, IEnumerable<AppLines> 
{ 
    public int code { get; set; } 
    public DateTime end_date { get; set; } 
    public string vertical { get; set; } 
    public string granularity { get; set; } 
    public string device { get; set; } 
    public List<AppLines> AppLine { get; set; } 
    private int position; 

    //IEnumerator and IEnumerable require these methods. 
    public IEnumerator<AppLines> GetEnumerator() 
    { 
     return (IEnumerator<AppLines>)this; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return (IEnumerator<AppLines>)this; 
    } 

    //IEnumerator 
    public bool MoveNext() 
    { 
     position++; 
     return (position < AppLine.Count); 
    } 

    //IEnumerable 
    public void Reset() 
    { position = 0; } 

    //IEnumerable 
    object IEnumerator.Current 
    { 
     get { return (AppLine.ToArray())[position] ; } 
    } 

    public AppLines Current 
    { 
     get { return (AppLine.ToArray())[position] ; } 
    } 

    public void Dispose() 
    { 
     // do something or not 
    } 
} 

利用顯式接口實現的(也可能想擺脫重複的代碼)。

+0

泰克斯,這是完美的 –

0

開始與事後再利用內部列表的方法和層在您的定製邏輯:

using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    public class AppLines { } 
    public class AppAnnieImport : IEnumerator<AppLines>, IEnumerable<AppLines> 
    { 
     public int code { get; set; } 
     public DateTime end_date { get; set; } 
     public string vertical { get; set; } 
     public string granularity { get; set; } 
     public string device { get; set; } 
     public List<AppLines> appLines { get; set; } 
     private int position; 

     AppLines IEnumerator<AppLines>.Current 
     { 
      get { return ((IEnumerator<AppLines>)this.appLines).Current; } 
     } 

     public void Dispose() 
     { 
      ((IEnumerator<AppLines>)this.appLines).Dispose(); 
     } 

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

     object System.Collections.IEnumerator.Current 
     { 
      get { return ((System.Collections.IEnumerator)this.appLines).Current; } 
     } 

     public bool MoveNext() 
     { 
      return ((System.Collections.IEnumerator)this.appLines).MoveNext(); 
     } 

     public void Reset() 
     { 
      ((System.Collections.IEnumerator)this.appLines).Reset(); 
     } 

     IEnumerator<AppLines> IEnumerable<AppLines>.GetEnumerator() 
     { 
      return ((IEnumerable<AppLines>)this.appLines).GetEnumerator(); 
     } 
    } 
}