3

我想实现一个 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”已包含“当前”D:\CE\Supins\Cyan Pembuat Soal\Required Manipulation\Class1.cs 的定义 32 25 所需操作

但是如果我删除当前对象之一,那么错误是

错误 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 所需操作

帮我修复代码。

4

1 回答 1

8

您需要为或之一使用显式接口实现。通常,您显式地实现非泛型接口(在需要的地方),并将该实现委托给泛型接口:IEnumerator.CurrentIEnumerator<T>.Current

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

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

请注意,为了正确获取第一个元素,您应该初始化len为 -1 以(和 on Reset)开头...并理想地lenCurrent属性中验证。

请注意,在实施时IEnumerable<T>您需要做同样的事情,例如

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

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}
于 2013-08-11T07:50:34.510 回答