Подтвердить что ты не робот

Как установить необязательный параметр без постоянной времени компиляции

Есть ли способ написать ниже метод С#:

public string Download(Encoding contentEncoding = null) {
    defaultEncoding = contentEncoding ?? Encoding.UTF8;
    // codes...
}

с добавленным параметром по умолчанию, поэтому он выглядит так:

public string Download(Encoding contentEncoding = Encoding.UTF8) {
    // codes...
}

без использования константы времени компиляции?

4b9b3361

Ответ 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...
}

Обратите внимание, что это не совсем то же самое, что и дополнительные параметры, поскольку значение по умолчанию становится жестко закодированным в вызывающем абоненте с необязательными параметрами (вот почему существуют ограничения для них).

Ответ 2

Использовать перегрузки:

public string Download(Encoding contentEncoding)
{
   // codes...
}

public string Download()
{
    return Download(Encoding.UTF8);
}

Ответ 3

public static string Download(Encoding encoder = null)
{
    if (encoder == null)
        encoder = Encoding.Default


   string returnVal="";
   // do something

    return returnVal;
}