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

我该如何解决这个问题?

您需要使用显式接口实现来实现至少一种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 会自动创建两个方法。一种用于通用实现,另一种用于非通用实现(您已经拥有的),因为也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 回答