【问题标题】:Is it possible to upgrade to Generic IEnumerable without breaking binary compatibility是否可以在不破坏二进制兼容性的情况下升级到通用 IEnumerable
【发布时间】:2013-01-16 01:26:12
【问题描述】:

Fiddler 的 HTTPHeaders 类有一个成员 Storage,它是一个 List<HTTPHeaderItem>

HTTPHeaders 类因此以 .NET 1.1 样式公开了一个枚举器:public System.Collections.IEnumerator GetEnumerator()。这个方法只返回Storage.GetEnumerator()

问题:

  1. 不实现IEnumerable<HTTPHeaderItem> 是否会降低性能?还是foreach(HTTPHeaderItem in oHTTPHeaders)的编译足够聪明,可以识别出它返回的对象也实现了IEnumerable的特定类型版本,避免了一堆强制转换?

  2. 实现IEnumerable<HTTPHeaderItem> 而不隐藏(通过显式接口实现)旧的GetEnumerator() 方法是否甚至可能?隐藏旧方法会破坏与旧扩展的二进制兼容性(例如Method not found: 'System.Collections.IEnumerator Fiddler.HTTPHeaders.GetEnumerator()'。)

结果

*正如下面 Servy 的回答所指出的,在添加返回类型专用枚举器的公共 GetEnumerable() 时,没有简单的方法可以避免破坏二进制兼容性。

但是,在我的具体情况下,我有点幸运。 HTTPHeaders 是一个基类,几乎所有调用者都使用两个派生类之一(HTTPRequestHeaders 和 HTTPResponseHeaders)。我已经为每个派生类添加了公共通用 GetEnumerator() 方法。这些新的特定于类型的枚举器由针对新版本编译的代码调用,而尚未重新编译的旧插件仍然从基类中检索非泛型枚举器。*

【问题讨论】:

  • 你可以明确地实现IEnumerable<HTTPHeaderItem>。非通用版本将是公开版本,不应破坏兼容性。不过,我不知道foreach 循环会使用哪一个。
  • 正如 Servy 的回答中所阐述的那样,foreach() 最终使用了公共的。

标签: c# ienumerable


【解决方案1】:
  1. 您需要提供 一些 GetEnumerator 方法,该方法返回实际的 HTTPHeaderItem 类型,以便避免强制转换。这意味着要么实现IEnumerable<HTTPHeaderItem>,要么让一个隐式GetEnumerator 方法返回实际类型。在一般情况下,这意味着您可以依赖 Duck 类型,而不是实现 IEnumerable<T>,但在您的情况下,由于这样的方法已经存在且签名错误,这是不可能的。

  2. 当然。只需隐藏IEnumerable<HTTPHeaderItem> 实现而不是IEnumerable 实现。这正是数组的作用(保持二进制兼容性)。

这是一个简单的例子:

public class Foo : IEnumerable, IEnumerable<HTTPHeaderItem>
{

    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }

    IEnumerator<HTTPHeaderItem> IEnumerable<HTTPHeaderItem>.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

【讨论】:

  • 对于#2,当我添加显式 IEnumerator 实现时,调用 foreach(HTTPHeaders 中的 HTTPHeaderItem oHI)不会使用它。因此添加该方法似乎毫无意义?
  • @EricLaw 您需要做一些事情将其视为IEnumerable&lt;T&gt; 才能获取通用版本,是的。这确实是非泛型版本是隐式实现方法的缺陷之一。
猜你喜欢
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2018-12-27
  • 1970-01-01
  • 2013-03-24
相关资源
最近更新 更多