如何在C#中创建一个类型化的IEnumerable?

Mat*_*att 4 .net c# ienumerable iterator interface

我可以做这个:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不能这样做?:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误基本上说我错过了方法

    public System.Collections.IEnumerator GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

当我改变返回类型时GetEnumerator(),它告诉我我失踪了

    public System.Collections.Generic.IEnumerator<string> GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

如果我尝试包括两者,它告诉我我有一个重复的方法名称.

我怎么解决这个问题?

Jon*_*eet 9

我怎么解决这个问题?

您需要使用显式接口实现来实现至少一种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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Bla*_*hma 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();
    }
}
Run Code Online (Sandbox Code Playgroud)