c# - 是否可以在不破坏二进制兼容性的情况下升级到 Generic IEnumerable

标签 c# ienumerable

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>不隐藏(通过显式接口(interface)实现)旧的 GetEnumerator() 方法?隐藏旧方法会破坏与旧扩展的二进制兼容性(例如 Method not found: 'System.Collections.IEnumerator Fiddler.HTTPHeaders.GetEnumerator() '.)

结果

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

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

最佳答案

  1. 您需要提供一些 GetEnumerator 方法来返回实际的 HTTPHeaderItem 类型以避免转换。这意味着要么实现 IEnumerable<HTTPHeaderItem>或者有一个隐含的 GetEnumerator方法返回实际类型。在一般情况下,这意味着您可以依赖 Duck typing,而不是实现 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();
    }
}

关于c# - 是否可以在不破坏二进制兼容性的情况下升级到 Generic IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634346/

相关文章:

c# - ApiController 扩展方法 - 无法访问 ResponseMessage

c# - 如何使用发布日期作为 .net 项目的程序集版本?

c# - 如何选择 IEnumerable 对象的前三个元素?

linq - 将 LINQ 应用到对象分组依据和排序依据到泛型 List<T> (C#)

c# - 无法将类型 'System.Collections.Generic.List<String>' 隐式转换为 'System.Collections.Generic.IEnumerable<turon.Model.Products_Products>

c# - 界面中的通用列表

c# - 具有多个 IEnumerable<T> 接口(interface)的类 - 如何处理非泛型方法?

c# - 这是 AutoMapper 2.0.0 和 2.2.0 之间的重大变化吗?

c# Linq 的 - GroupedEnumerable 用法?

c# - Java编码base64,C#解码