Я знаю, что добавление необязательного параметра в метод библиотеки является нарушением изменений,
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 и компиляторами С#/VB? Или вызовы методов с необязательными параметрами как-то "помечены", что приводит к их сбой при замене дополнительных параметров перегрузками?
EDIT: Чтобы уточнить, я спрашиваю о двоичной совместимости: возможно ли заменить library.dll (old)
на library.dll (new)
без перекомпиляции projectUsingLibrary.exe
?