Ответ 1
Короче. Нет.
Необязательные параметры необходимы для компиляции временных констант или типов значений.
Из Именованные и необязательные аргументы (Руководство по программированию на С#) в MSDN:
Каждый необязательный параметр имеет значение по умолчанию как часть своего определения. Если для этого параметра не отправляется аргумент, используется значение по умолчанию. Значение по умолчанию должно быть одним из следующих типов выражений:
- постоянное выражение;
- выражение формы
new ValType()
, гдеValType
- тип значения, такой как перечисление или структура;- выражение формы
default(ValType)
, гдеValType
- тип значения.
То, что вы, кажется, хотите достичь, может быть достигнуто путем перегрузки:
public string Download()
{
return Download(Encoding.UTF8);
}
public string Download(Encoding contentEncoding)
{
defaultEncoding = contentEncoding ?? Encoding.UTF8;
// codes...
}
Обратите внимание, что это не совсем то же самое, что и дополнительные параметры, поскольку значение по умолчанию становится жестко закодированным в вызывающем абоненте с необязательными параметрами (вот почему существуют ограничения для них).