【问题标题】:Does changing the return type of a function for a child type breaks binary compatibility?更改子类型的函数的返回类型会破坏二进制兼容性吗?
【发布时间】:2013-01-29 17:21:51
【问题描述】:

让我们直接开始吧:

旧代码:

public interface IFoo {}
public class Foo : IFoo {}
...
public static IFoo Bar() { return new Foo(); }

新代码:

public static Foo Bar() { return new Foo(); }

显然这里应该没有问题,你在旧返回类型上所做的一切,你仍然可以在新返回类型上做,任何isas 或强制转换都应该和以前一样......

那么我是否破坏了二进制兼容性,或者我可以将其作为次要版本发布而不打扰用户?

【问题讨论】:

    标签: c# inheritance binary-compatibility


    【解决方案1】:

    这会破坏二进制兼容性,但不会(大多数)编译时兼容性问题,因此它通常是一个简单的迁移。

    请注意,如果客户端代码从方法构造委托,它甚至可能是编译时中断。

    【讨论】:

    • 明确地说,如果代码的某些使用者编写了Func<IFoo> f = TheType.Bar;,其中TheType 是提问者的类的名称,那将会中断。
    • 其实我不认为我的例子(上面的评论)是正确的。如果Foostruct,那将是正确的,但它是class。其实我也想不出例子。你能帮帮我吗?
    【解决方案2】:

    您可能会遇到围绕您的代码创建单元测试的人的问题。因为它是静态的,所以人们可以按如下方式创建 FooAdapter:-

    public class FooAdapater(){ 
    public IFoo GetFoo() { Return your static Bar; }
    }
    

    然后他们可以创建一个模拟的 foo 适配器而不是返回一个模拟的 foo。您的代码会破坏这种情况。

    所以,不,它不是二进制兼容的 :-)

    【讨论】:

    • 这不会影响他的直接类型,因为这是类或结构中的静态方法(不可覆盖)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多