gpt4 book ai didi

c# - 如何在实现 IEnumerable 的 Dictionary 包装器类中实现 IEnumerable?

转载 作者:太空狗 更新时间:2023-10-29 19:50:48 27 4
gpt4 key购买 nike

我正在尝试为 Dictionary<String,Foo> 创建一个包装器.

Dictionary<String,Foo>工具 IEnumerable<KeyValuePair<String,Foo>> ,但我希望我的包装类实现 IEnumerable<Foo> .所以我尝试了这个:

public class FooCollection : IEnumerable<Foo>
{
private Dictionary<string, Foo> fooDictionary = new Dictionary<string, Foo>();

public IEnumerator<Foo> GetEnumerator()
{
return fooDictionary.Values.GetEnumerator();
}

// Other wrapper methods omitted

}

但是我得到这个错误:

'FooCollection' does not implement interface member 'System.Collections.IEnumerable.GetEnumerator()'. 'FooCollection.GetEnumerator()' cannot implement 'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching return type of 'System.Collections.IEnumerator'.

但是我不明白这个错误,因为FooCollection.GetEnumerator()返回 IEnumerator<Foo> , 和 IEnumerator<Foo>是一个 IEnumerator .

编辑:

显式实现IEnumerator.GetEnumerator()的解决方案作品。但是我现在想知道为什么当我在 List<T> 上“转到定义”时我只看到 GetEnumerator 的一个定义: public List<T>.Enumerator GetEnumerator();

显然 List<T>可以有一个 GetEnumerator返回同时实现 IEnumerator<T> 的东西的方法和 IEnumerator ,但我必须为每个方法设置一种方法吗?

编辑:

正如下面 LukeH 的回答,List<T> 确实包括显式接口(interface)实现。显然,Visual Studio 在从元数据生成方法 stub 时不会列出这些。 (请参阅上一个问题:Why does the VS Metadata view does not display explicit interface implemented members)

在发布这个问题之前,我曾尝试检查 List<T> (通过 Visual Studio 中的“转到定义”)查看我是否需要实现多个版本的 GetEnumerator。我想这不是最可靠的检查方法。

无论如何,我将其标记为已回答。感谢您的帮助。

最佳答案

添加以下显式接口(interface)实现:

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

尽管IEnumerator<T>是一个 IEnumerator , 契约(Contract) IEnumerable返回 IEnumerator具体来说,不是 IEnumerator<T>

关于c# - 如何在实现 IEnumerable<Foo> 的 Dictionary 包装器类中实现 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7692455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com