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

如何在C#中创建类型化IEnumerable?,c#,.net,interface,iterator,ienumerable,C#,.net,Interface,Iterator,Ienumerable,我可以这样做: public class EnumerableTest : System.Collections.IEnumerable { System.Collections.IEnumerable data; public EnumerableTest(System.Collections.IEnumerable d) { data = d; } public System.Collections.IEnumerator GetE

我可以这样做:

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;
        }
    }
}
当我将
GetEnumerator()
的返回类型更改为该类型时,它会告诉我缺少

    public System.Collections.Generic.IEnumerator<string> GetEnumerator();
public System.Collections.Generic.IEnumerator GetEnumerator();
如果我尝试同时包含这两个,它会告诉我我有一个重复的方法名


如何解决这个问题?

改为实现
System.Collections.Generic.IEnumerable

使用VS的智能标记执行此操作时,VS会自动创建两个方法。一个用于泛型实现,另一个用于非泛型实现(您已经拥有的),因为
IEnumerable
要求您也实现
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
}
公共类StringData:IEnumerable
{
...
#区域可数成员
公共IEnumerator GetEnumerator()
{
foreach(数据中的字符串s){
收益率;
}
}
#端区
#区域可数成员
IEnumerator IEnumerable.GetEnumerator()
{
返回此值。GetEnumerator();//调用通用GetEnumerator
}
#端区
}
请注意,非泛型方法是显式实现的,因此只能通过接口(
IEnumerable x=…;x.GetEnumerator()
)进行访问。它的目的是增加兼容性,并且是前通用c#版本(1.0,1.1)的残余。创建这两个版本-例如,一个显式实现将调用隐式实现

示例:

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();
    }
}
公共类EnumerableTestString:System.Collections.Generic.IEnumerable { System.Collections.Generic.IEnumerable数据; 公共EnumerableTestString(System.Collections.Generic.IEnumerable d) { 数据=d; } public System.Collections.Generic.IEnumerator GetEnumerator() { foreach(数据中的字符串s) { 收益率; } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { 返回GetEnumerator(); } } 我怎样才能解决这个问题

您需要使用来实现至少一个
GetEnumerator
方法,通常是非泛型方法

代码只是通过
使用
指令:)

使用系统集合;
使用System.Collections.Generic;
公共类EnumerableTestString:IEnumerable
{
私有可数数据;
公共EnumerableTestString(IEnumerable d)
{
数据=d;
}
公共IEnumerator GetEnumerator()
{
foreach(数据中的字符串s)
{
收益率;
}
}
//非泛型IEnumerable的显式接口实现
公共IEnumerator IEnumerable.GetEnumerator()
{
//委托给泛型版本
返回GetEnumerator();
}
}
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();
    }
}
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();
    }
}