void Foo(int x) // OLD
void Foo(int x, int y = 5) // NEW
因为在编译的代码中,新版本被视为Foo(int, int)
. Foo(0)
(源代码)的每个调用Foo(0, 5)
都由编译器翻译成(编译代码)。因此,使用编译调用的旧客户端Foo(0)
将找不到合适的方法。
另一个方向呢?
void Foo(int x, int y = 5) { ... } // OLD
void Foo(int x) { Foo(x, 5); } // NEW
void Foo(int x, int y) { ... } // NEW
Foo(0)
(source code) 仍然可以编译,并且Foo(0, 5)
(compiled code) 仍然会找到合适的重载,因此,理论上,这应该可以工作。
它在实践中是否有效,即.NET 运行时和 C#/VB 编译器是否“正式支持”这种场景?还是对带有可选参数的方法的调用以某种方式“标记”,导致当可选参数被重载替换时它们会失败?
编辑:为了澄清,我问的是二进制兼容性:是否可以在不重新编译的情况下library.dll (old)
替换?library.dll (new)
projectUsingLibrary.exe