Я читал статью о том, как необязательные аргументы ломаются при изменении версий.
Перефразировать здесь.
Давайте рассмотрим краткий пример работы этих двух концепций.Предположим, у нас есть класс с одним методом, имеющий следующую сигнатуру.
// v1
public static void Redirect(string url, string protocol = "http");
Эта гипотетическая библиотека содержит один метод, который принимает два параметра, обязательный URL-адрес строки и необязательный строковый протокол.
Ниже показаны шесть возможных способов вызова этого метода.
HttpHelpers.Redirect("https://haacked.com/");
HttpHelpers.Redirect(url: "https://haacked.com/");
HttpHelpers.Redirect("https://haacked.com/", "https");
HttpHelpers.Redirect("https://haacked.com/", protocol: "https");
HttpHelpers.Redirect(url: "https://haacked.com/", protocol: https");
HttpHelpers.Redirect(protocol: "https", url: https://haacked.com/");
Обратите внимание, что независимо от того, является ли параметр необязательным, вы можете выбрать ссылку на параметр по имени или нет.В последнем случае обратите внимание, что параметры указаны не по порядку.В этом случае требуется использование именованных параметров.
Следующая версия
Одним из очевидных преимуществ использования дополнительных параметров является то, что вы можете уменьшить количество перегрузок, которые имеет ваш API.Однако опора на необязательные параметры имеет свои особенности, о которых вам нужно знать, когда дело доходит до управления версиями.
Предположим, мы готовы сделать вторую версию нашей удивительной библиотеки HttpHelpers и добавим необязательный параметр всуществующий метод.
// v2
public static void Redirect(string url, string protocol = "http", bool permanent = false);
Что происходит, когда мы пытаемся выполнить клиент без перекомпиляции клиентского приложения?
Мы получаем следующее сообщение об исключении.
Unhandled Exception: System.MissingMethodException: Method not found: 'Void HttpLib.HttpHelpers.Redirect(System.String,
System.String)'....
Меня смущает, почему это изменение нарушит развернутые не перекомпилированные изменения.
После изменения сигнатуры метода, которая включает необязательный параметр, он все равно должен работать, не так ли?даже если мы не перекомпилируем клиентское приложение, так как это необязательный параметр.