我想实现一个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所需的操作
帮我修复代码。
答案 0 :(得分:8)
您需要将explicit interface implementation用于IEnumerator.Current
或IEnumerator<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();
}