4

私がすることができます:

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();

両方を含めようとすると、メソッド名が重複していることがわかります。

どうすればこれを解決できますか?

4

3 に答える 3

9

どうすればこれを解決できますか?

明示的なインターフェイス実装を使用して、少なくとも1つの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();
    }
}
于 2012-11-29T15:08:24.137 に答える
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();
    }
}
于 2012-11-29T15:07:53.937 に答える
1

System.Collections.Generic.IEnumerable<T>代わりに実装してください。

VSのスマートタグを使用してこれを行うと、VSは自動的に2つのメソッドを作成します。1つはジェネリック実装用で、もう1つは非ジェネリック実装用(既に持っているもの)です。これは、同様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)の名残です。

于 2012-11-29T15:07:53.330 に答える