枚举失败重载

时间:2013-08-11 07:47:01

标签: c#

我想实现一个IEnumerator。但它会导致错误

public class WachableDictionaryEnumerator : IEnumerator<TVal>
{
    private TVal[] a;
    private int len;
    public bool MoveNext()
    {
        len = len + 1;
        return len < a.Length;
    }
    public object Current
    {
        get
        {
            return a[len];
        }
    }
    public TVal Current
    {
        get
        {
            return a[len];
        }
    }
    public void Dispose()
    {
        a = null;
        len = 0;
    }
    public void Reset()
    {
        len = 0;
    }
}

错误是:

  

错误5类型   'CPS.Manipulation.WatchableDictionary.WachableDictionaryEnumerator'   已经包含'Current'D:\ CE \ Supins \ Cyan Pembuat的定义   Soal \ Required Manipulation \ Class1.cs 32 25必需的操作

但是如果我删除了一个Current对象,则错误是

  

错误21'CPS.Manipulation.WatchableDictionary.WachableDictionaryEnumerator'   没有实现接口成员   'System.Collections.Generic.IEnumerator.Current'。   'CPS.Manipulation.WatchableDictionary.WachableDictionaryEnumerator.Current'   无法实施   'System.Collections.Generic.IEnumerator.Current',因为它确实如此   没有匹配的返回类型'TVal'。 D:\ CE \ Supins \ Cyan Pembuat   Soal \ Required Manipulation \ Class1.cs 16 22所需的操作

帮我修复代码。

1 个答案:

答案 0 :(得分:8)

您需要将explicit interface implementation用于IEnumerator.CurrentIEnumerator<T>.Current之一。通常,您明确地实现非通用接口(您需要的地方),并将该实现委托给通用接口:

// Explicit interface implementation
object IEnumerator.Current { get { return Current; } }

// Normal implementation
public TVal Current { get { return a[len]; } }

请注意,为了正确获取第一个元素,您应该将len初始化为-1以开始(并在Reset上)...并且理想情况下验证len属性中的Current

请注意,在实施IEnumerable<T>时,您需要执行相同的操作,例如

public IEnumerator<string> GetEnumerator()
{
    // Whatever
}

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}