Пожалуйста, подождите, это не (совсем!) Дубликат любого из этих ответов SO:
- Конфликт перегруженных методов с необязательными параметрами
- Разрешение перегрузки и дополнительные параметры в C # 4
- Вызов метода перегрузки с параметрами по умолчанию
При попытке «повлиять» на то, какая перегрузка будет выбрана компилятором с учетом конфликтов, возникающих из-за необязательных параметров, ответы в приведенных выше сообщениях ссылаются на Руководство по программированию на C #, в котором указана эвристика разрешения перегрузки (ИЛИ), которая используется здесь:
Если два кандидата признаны одинаково хорошими, предпочтение отдается кандидату, у которого нет дополнительных параметров, аргументы которых были опущены в вызове.
Справедливо. Мой вопрос: почему (или почему не может) атрибут Obsolete (или какая-либо другая разметка) не влияет на решение OR при оценке двух кандидатов как одинаково хороших? Например, рассмотрим следующие перегрузки:
[Obsolete(“This method is deprecated.”)]
[EditorBrowsable(EditorBrowsableState.Never)]]
bool foo() { return true; }
bool foo(bool optional = false) { return optional; }
Кажется, что OR не должен оценивать эти перегрузки как одинаково хорошие - нерекомендуемая перегрузка с необязательным параметром должна победить. Если бы это было так в этом чрезмерно упрощенном примере, код, ранее скомпилированный для foo (), был бы обратно совместим и, к счастью, продолжал бы возвращать истину. Будущий код, скомпилированный для этой библиотеки, также может вызывать foo (), но эта разрешенная перегрузка вернет false.
Это ценная / возможная функция, которую нам не хватает в языке? Или есть какой-нибудь другой способ заставить это мое желание работать? Спасибо за любые идеи,
-Майк