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)
(源代码)仍然可以编译,Foo(0, 5)
(已编译的代码)仍然可以找到合适的重载,因此理论上应该可以工作。
在实践中,它是否有效,即这种情况是否被.NET运行时和C#/VB编译器“官方支持”?或者调用具有可选参数的方法是否会被“标记”,导致当可选参数被重载替换时失败?
编辑:澄清一下,我正在询问二进制兼容性:是否可能在不重新编译projectUsingLibrary.exe
的情况下,用library.dll(new)
替换library.dll(old)
?
x
,Foo(x, 5)
等价于Foo(x)
,则可以接受。 - CodesInChaos