Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改子类型的函数返回类型是否会破坏二进制兼容性?_C#_Inheritance_Binary Compatibility - Fatal编程技术网

C# 更改子类型的函数返回类型是否会破坏二进制兼容性?

C# 更改子类型的函数返回类型是否会破坏二进制兼容性?,c#,inheritance,binary-compatibility,C#,Inheritance,Binary Compatibility,让我们直奔主题: 旧代码: public interface IFoo {} public class Foo : IFoo {} ... public static IFoo Bar() { return new Foo(); } 新代码: public static Foo Bar() { return new Foo(); } 显然这里应该没有问题,您在旧返回类型上所做的一切,您仍然可以在新返回类型上所做的一切,任何都是,as或cast的行为应该与以前相同 那么,我是否破坏了二进制兼容

让我们直奔主题:

旧代码:

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

public static Foo Bar() { return new Foo(); }
显然这里应该没有问题,您在旧返回类型上所做的一切,您仍然可以在新返回类型上所做的一切,任何
都是
as
或cast的行为应该与以前相同


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

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


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

您可能会遇到与围绕您的代码创建单元测试的人员的问题。因为它是静态的,所以人们可以创建一个FooadPater,如下所示:-

public class FooAdapater(){ 
public IFoo GetFoo() { Return your static Bar; }
}
然后,他们可以创建一个模拟的foo适配器,然后返回一个模拟的foo。您的代码将打破这种情况


因此,不,它不是二进制兼容的:-)

这不会影响他的直接类型,因为这是类或结构中的静态方法(不可重写)…如果代码的某个使用者编写了
Func f=TheType.Bar
其中
类型
是询问者的类名称,这将中断。实际上我认为我的示例(上面的注释)不正确。如果
Foo
是一个
struct
,这是正确的,但它是一个
。实际上我想不出一个例子。你能帮助我吗?