Вообще-то Kiguinko прав!
В доках есть раздел о дефолтных параметрах в C#, то реально облом!
ЯГ>Обусловлено это спецификой работы .NET. Две причины: ЯГ>1. Подставить параметр на вызываемой стороне нельзя, т.к. .NET, как и СОМ работает на интерфейсах, а интерфейс — контракт, в котором форма вызовов методов строго определена. Значит параметр нельзя опустить.
По-моему Вы не правы. Уж точно Вы не правы насчет COM-а. В COM-ме есть дефолтные параметры.
Да и в CLR-ных языках сделать, это как рас плюнуть. Дело в том, что информацию о параметрах можно разместить в Reflection-информации (.Net-овском аналоге TLB-х).
При этом конкретный язык может читать ее при компиляции и добавлять значение параметра в MSIL-код.
ЯГ>2. Подставить параметр на вызывающей стороне нельзя, т.к. связь объектов происходит в runtime...
Я и говорю... НЕ в рантайме, а при компиляции.
ЯГ>... а значит, пропадает контроль за версиями. Как сообщить клиенту, что новая версия объекта в качестве параметра по умолчанию теперь ожидает не 1, а 2?
Скомпилированная программа должна работать с теми предположениями (о значении дефолтных параметров) которые были верными на момент компиляции. Если это будет не так, то вероятность вылет будет 90%.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.