2012-11-29 33 views
4

我可以這樣做:如何在C#中創建一個IEnumerable類型?

public class EnumerableTest : System.Collections.IEnumerable 
{ 
    System.Collections.IEnumerable data; 

    public EnumerableTest(System.Collections.IEnumerable d) 
    { 
     data = d; 
    } 

    public System.Collections.IEnumerator GetEnumerator() 
    { 
     foreach (object s in data) 
     { 
      yield return s; 
     } 
    } 
} 

但我不能做到這一點?:

public class EnumerableTestString : System.Collections.Generic.IEnumerable<string> 
{ 
    System.Collections.Generic.IEnumerable<string> data; 

    public EnumerableTestString(System.Collections.Generic.IEnumerable<string> d) 
    { 
     data = d; 
    } 

    public System.Collections.Generic.IEnumerator<string> GetEnumerator() 
    { 
     foreach (string s in data) 
     { 
      yield return s; 
     } 
    } 
} 

的錯誤,我得到基本上說我缺少的方法

public System.Collections.IEnumerator GetEnumerator(); 

當我將返回類型GetEnumerator()更改爲那個,然後它告訴我我缺少了

public System.Collections.Generic.IEnumerator<string> GetEnumerator(); 

如果我試圖包括兩個,它告訴我我有一個重複的方法名稱。

我該如何解決這個問題?

回答

7

創建均爲 - 例如一個Explicit實現將調用Implicit實現。

例子:

public class EnumerableTestString : System.Collections.Generic.IEnumerable<string> 
{ 
    System.Collections.Generic.IEnumerable<string> data; 

    public EnumerableTestString(System.Collections.Generic.IEnumerable<string> d) 
    { 
     data = d; 
    } 

    public System.Collections.Generic.IEnumerator<string> GetEnumerator() 
    { 
     foreach (string s in data) 
     { 
      yield return s; 
     } 
    } 

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

改爲執行System.Collections.Generic.IEnumerable<T>

當你這樣做使用VS的智能標籤,VS會自動創建兩種方法。一個用於通用實施,另一個用於非通用實施(因爲您已經擁有),因爲IEnumerable<T>要求您也實施IEnumerable

public class StringData : IEnumerable<string> 
{ 
    ... 

    #region IEnumerable<string> Members 

    public IEnumerator<string> GetEnumerator() 
    { 
     foreach (string s in data) { 
      yield return s; 
     } 
    } 

    #endregion 

    #region IEnumerable Members 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); // Calls generic GetEnumerator 
    } 

    #endregion 
} 

注意的是,非通用方法被明確地實現,並且可因此僅通過接口(IEnumerable x = ...; x.GetEnumerator())進行訪問。它的目的是提高兼容性,並且是預通用c#版本(1.0,1.1)的補充。

9

我該如何解決這個問題?

您需要使用explicit interface implementation來實現至少一個GetEnumerator方法,通常是非通用方法。

的代碼是簡單地using指令:)

using System.Collections; 
using System.Collections.Generic; 

public class EnumerableTestString : IEnumerable<string> 
{ 
    private IEnumerable<string> data; 

    public EnumerableTestString(IEnumerable<string> d) 
    { 
     data = d; 
    } 

    public IEnumerator<string> GetEnumerator() 
    { 
     foreach (string s in data) 
     { 
      yield return s; 
     } 
    } 

    // Explicit interface implementation for non-generic IEnumerable 
    public IEnumerator IEnumerable.GetEnumerator() 
    { 
     // Delegate to the generic version 
     return GetEnumerator(); 
    } 
} 
相關問題