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
: