Почему параметр out не имеет значения по умолчанию?

В настоящее время, когда вы пытаетесь что-то сделать в методе, который принимает параметр out, мне нужно назначить значение параметра out в теле метода, например.

public static void TryDoSomething(int value, out bool itWorkerd)
{
 itWorkerd = true;
 if (someFavourableCondition)
 {
 // if I didn't assign itWorked variable before this point, 
 // I get an error: "Parameter itWorked must be assigned upon exit.
 return;
 }
 // try to do thing
 itWorkerd = // success of attempt to do thing
}

Я хотел бы иметь возможность установить значение по умолчанию для параметра itWorked, поэтому мне не нужно произвольно устанавливать значение в теле метода.

public static void TryDoSomething(int value, out bool itWorkerd = true)
{
 if (someFavourableCondition)
 {
 // itWorked was already assigned with a default value
 // so no compile errors.
 return;
 }
 // try to do thing
 itWorkerd = // success of attempt to do thing
}

Почему невозможно присвоить значение по умолчанию для параметра out?

5 ответов

Значения по умолчанию доступны для параметров, переданных по значению. Параметр по-прежнему передается функции, но если код опускает параметр, компилятор передает отсутствующее значение.

Ваша предлагаемая функция совсем другая. Вместо того, чтобы вызывающий абонент пропускал значение, вы предлагаете разрешить исполнителю функции опустить установку значения. Итак, это совсем другая особенность. Почему он не был реализован? Вот несколько возможных причин:

  • Никто не думал реализовать эту функцию.
  • Дизайнеры рассмотрели эту функцию и отклонили ее как недостаточно полезную, чтобы стоить затрат на ее реализацию.
  • Дизайнеры рассмотрели эту функцию и отвергли ее как запутанную, потому что она использует аналогичный синтаксис для параметров значения по умолчанию, но имеет совершенно другое значение.


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

Так как С# 7 теперь позволяет параметрам эффективно быть объявлениями переменных в области вызова, назначение значения по умолчанию было бы полезно.

Рассмотрим следующий простой способ:

private void ResolveStatusName(string statusName, out string statusCode)
 {
 statusCode = "";
 if (statusName != "Any")
 {
 statusCode = statusName.Length > 1
 ? statusName.Substring(0, 1)
 : statusName;
 }
 }

Было ясно, что нужно изменить его так:

private void ResolveStatusName(string statusName, out string statusCode = "")
 {
 if (statusName != "Any")
 {
 statusCode = statusName.Length > 1
 ? statusName.Substring(0, 1)
 : statusName;
 }
 }

Цель состояла в том, чтобы не только объявить значение statusCode, но и определить его значение по умолчанию, но компилятор не разрешает его.


Даже если это позволило вам присвоить значение по умолчанию, подобное этому, вам все равно потребуется присвоить значение для параметра для всех возвратов. Таким образом, ваше значение по умолчанию будет переопределено.


Ключевое слово параметра метода out из параметра метода заставляет метод ссылаться на ту же переменную, которая была передана в этот метод. Любые изменения, внесенные в параметр в методе, будут отражаться в этой переменной, когда управление переходит к вызывающему методу. Объявление метода out полезно, если вы хотите, чтобы метод возвращал несколько значений. Метод, который использует параметр out, все равно может вернуть значение. Метод может иметь более одного параметра out. Чтобы использовать параметр out, аргумент должен быть явно передан методу в качестве аргумента out. Значение аргумента out не будет передано параметру out. Переменная, переданная как аргумент out, не должна быть инициализирована. Тем не менее параметру out должно быть присвоено значение перед возвратом метода.

Компилятор не позволит вам использовать параметр в качестве параметра по умолчанию, поскольку он нарушает его прецедент. если вы не передадите его функции, вы не сможете использовать его значение при вызове функции.

если вы могли бы вызвать функцию ниже, как TryDoSomething(123), тогда нет смысла использовать параметр out, потому что вы не сможете использовать значение itWorked

public static void TryDoSomething(int value, out bool itWorkerd = true)
{
 if (someFavourableCondition)
 {
 // itWorked was already assigned with a default value
 // so no compile errors.
 return;
 }
 // try to do thing
 itWorkerd = // success of attempt to do thing
}


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

Ваш первый пример, в некотором смысле, имеет значение по умолчанию, установленное в начале метода.

licensed under cc by-sa 3.0 with attribution.