Je suis conscient que l'ajout d'un paramètre facultatif dans une méthode de bibliothèque est une modification de rupture ,
void Foo(int x) // OLD
void Foo(int x, int y = 5) // NEW
parce que dans le code compilé la nouvelle version est vue comme Foo(int, int)
. Chaque appel de Foo(0)
(code source) est traduit en Foo(0, 5)
(code compilé) par le compilateur. Ainsi, un ancien client, utilisant un appel compilé de Foo(0)
n'a pas trouvé de méthode appropriée.
Et dans l'autre sens ?
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)
(code source) compilerait toujours, et Foo(0, 5)
(code compilé) trouverait toujours une surcharge appropriée, donc, théoriquement, cela devrait fonctionner.
Cela fonctionne-t-il dans la pratique, c'est-à-dire que ce scénario est "officiellement supporté" par le runtime .NET et les compilateurs C#/VB ? Ou les appels aux méthodes avec des paramètres facultatifs sont-ils en quelque sorte "marqués", ce qui les fait échouer lorsque les paramètres facultatifs sont remplacés par des surcharges ?
EDIT : Pour clarifier, je demande à propos de compatibilité binaire : Est-il possible de remplacer library.dll (old)
con library.dll (new)
sans recompiler projectUsingLibrary.exe
?