【问题标题】:Why IDictionary<TKey, TValue> implements both ICollection and IEnumerable为什么 IDictionary<TKey, TValue> 同时实现 ICollection 和 IEnumerable
【发布时间】:2018-05-04 08:35:53
【问题描述】:

我正在查看为IDictionary&lt;TKey, TValue&gt; 接口生成的元数据,我注意到它实现了

public interface IDictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

这不是多余的吗?查看ICollection&lt;T&gt;的元数据表明它已经实现了IEnumerable&lt;T&gt;, IEnumerable

为什么IEnumerable&lt;T&gt; 实现了IEnumerable,而ICollection&lt;T&gt; 没有实现ICollection

【问题讨论】:

标签: c# interface implementation


【解决方案1】:

元数据显示所有实现的接口,尤其是那些通过继承获得的接口。如果你查看IDictionary&lt;TKey, TValue&gt;reference source,你会发现实际的实现只实现了ICollection&lt;KeyValuePair&lt;TKey, TValue&gt;&gt;

public interface IDictionary<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>

【讨论】:

  • 所以它只是显示它正在实现的所有接口(递归),而不仅仅是那些明确声明的接口
【解决方案2】:

阅读this。它解释了您想了解的关于第一个问题的所有信息。

我引用最相关的部分:

为什么反射器或对象浏览器等工具会显示整个列表?

那些工具没有源代码。他们只有元数据 从工作。由于放入完整列表是可选的,因此该工具没有 了解原始源代码是否包含完整列表。 最好在更多信息方面犯错。再次,工具 试图通过向您显示更多信息来帮助您,而不是 隐藏您可能需要的信息

【讨论】:

    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2011-01-16
    • 2012-07-25
    相关资源
    最近更新 更多