C# IDictionaryEnumerator不是迭代器接口类型?

C# IDictionaryEnumerator不是迭代器接口类型?,c#,collections,yield,ienumerator,C#,Collections,Yield,Ienumerator,我正在尝试将一些使用哈希表的代码移植到没有此类的环境中。因此,我考虑不要弄乱代码,只需从字典创建我自己的哈希表,如下所示: public class Hashtable : Dictionary<Object, Object> { // ... new public IDictionaryEnumerator GetEnumerator() { var ie = base.GetEnumerator(); while (i

我正在尝试将一些使用哈希表的代码移植到没有此类的环境中。因此,我考虑不要弄乱代码,只需从
字典
创建我自己的
哈希表
,如下所示:

public class Hashtable : Dictionary<Object, Object> {
    // ...
    new public IDictionaryEnumerator GetEnumerator() {          

      var ie = base.GetEnumerator();
      while (ie.MoveNext())
          yield return new DictionaryEntry(ie.Current.Key, ie.Current.Value);
    }
}
公共类哈希表:字典{
// ...
新的公共IDictionaryEnumerator GetEnumerator(){
var ie=base.GetEnumerator();
while(即MoveNext())
返回新字典入口(即Current.Key,即Current.Value);
}
}
我得到了这个错误:

错误CS1624:“System.Collections.Hashtable.GetEnumerator()”的主体不能是迭代器块,因为“System.Collections.IDictionaryEnumerator”不是迭代器接口类型

但是,
IDictionaryEnumerator
继承自
IEnumerator

奇怪的是,如果我只返回
(idictionarynumerator)base.GetEnumerator()代码编译(但在foreach循环中的运行时失败)


我不明白这个错误告诉了我什么,也不知道如何正确地实现它。

迭代器块被编译器重写成实现
IEnumerable
IEnumerator
的类;编译器不知道如何生成实现
IDictionaryEnumerator
的类,因此不能使用迭代器块来实现该接口

一种可能的解决方法是提供您自己的
IDictionaryEnumerator
实现:

class Hashtable : Dictionary<object, object>
{
    new public IDictionaryEnumerator GetEnumerator()
    {
        return new DictionaryEnumerator(base.GetEnumerator());
    }

    struct DictionaryEnumerator : IDictionaryEnumerator
    {
        private Enumerator _en;

        public DictionaryEnumerator(Dictionary<object, object>.Enumerator en)
        {
            _en = en;
        }

        public object Current
        {
            get
            {
                return Entry;
            }
        }

        public DictionaryEntry Entry
        {
            get
            {
                var kvp = _en.Current;
                return new DictionaryEntry(kvp.Key, kvp.Value);
            }
        }

        public bool MoveNext()
        {
            bool result = _en.MoveNext();
            return result;
        }

        public void Reset()
        {
            throw new NotSupportedException();
        }

        public object Key
        {
            get
            {
                var kvp = _en.Current;
                return kvp.Key;
            }
        }

        public object Value
        {
            get
            {
                var kvp = _en.Current;
                return kvp.Value;
            }
        }
    }
}
类哈希表:字典
{
新的公共IDictionaryEnumerator GetEnumerator()
{
返回新的DictionaryEnumerator(base.GetEnumerator());
}
结构字典分子:IDictionaryEnumerator
{
私人统计员;;
公共字典分子(Dictionary.Enumerator en)
{
_en=en;
}
公共对象流
{
得到
{
返回条目;
}
}
公共词典入口条目
{
得到
{
var kvp=_en.电流;
返回新的DictionaryEntry(kvp.Key,kvp.Value);
}
}
公共图书馆
{
bool result=_en.MoveNext();
返回结果;
}
公共无效重置()
{
抛出新的NotSupportedException();
}
公共对象密钥
{
得到
{
var kvp=_en.电流;
返回kvp.Key;
}
}
公共对象价值
{
得到
{
var kvp=_en.电流;
返回kvp.Value;
}
}
}
}

它需要实现
IEnumerable
,而不是
IEnumerator
@MatthewWatson:迭代器块的返回类型可以是
IEnumerable
IEnumerable
IEnumerator
IEnumerator