Есть ли способ опустить параметр?

Предположим, у меня есть функция с параметром out, но мне не нужно его значение. Есть ли способ не передавать фактический параметр, если данный результат все равно будет отброшен?

РЕДАКТИРОВАТЬ:

Хотя этот вопрос был признан обманом необязательных выходных параметров, это возможно только в том случае, если вы посмотрите с точки зрения создателя метода. Если вы являетесь пользователем метода, вы не заинтересованы в том, чтобы сделать параметр необязательным, а просто не использовать его без объявления переменной. И хотя это невозможно, с C # 7.0 можно объявить в вызове метода. Так что вместо:

int unusedValue;
TryGetValue("key", out unusedValue);

ты получаешь:

TryGetValue("key", out int unusedValue);

или даже:

TryGetValue("key", out _);

Это должно быть добавлено в качестве ответа, но:

  • Я не могу ответить на этот вопрос, потому что он был помечен как обман;
  • вопрос, этот вопрос кажется обманом, на самом деле он требует другого.

person konrad.kruczynski    schedule 19.01.2011    source источник


Ответы (3)


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

C # 4.0 допускает необязательные параметры, но out параметры не могут быть необязательными.

РЕДАКТИРОВАТЬ: Кстати, вы также можете перегрузить метод:

int DoStuff()
{
    int temp;
    return DoStuff(out temp);
}

int DoStuff(out outParam)
{
    //...
}
person Justin Morgan    schedule 19.01.2011
comment
Что ж, я знаю, что мне не нужно его использовать. Я также хотел бы не передавать никакую переменную. Однако это ответ, спасибо. - person konrad.kruczynski; 19.01.2011

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

public void DoSomething(int param1, out int param2)
{
    /* Method work here */
}

public void DoSomething(int param1)
{
    int temp;
    DoSomething(param1, out temp);
}
person Doctor Blue    schedule 19.01.2011
comment
Этот ответ более функциональный. Не нужно изменять позже, если вы хотите его использовать или больше не использовать. - person elcool; 19.01.2011
comment
А если вы не владеете вызываемым методом, вы можете создать метод расширения, который будет имитировать для вас выходные параметры. - person Preston McCormick; 03.03.2017

Не уверен в C #, но в VB.Net вы можете просто передать константу в выходной параметр (byref). Поэтому, если у вас есть целое число в качестве выходного параметра, вам не нужно передавать фактическую переменную, вы можете просто передать 0 или любое другое допустимое целое число. Для объектов, включая строки, вы можете просто передать Nothing (Null в C #), и все работает нормально. Я не уверен, где хранится переменная, возможно, просто в стеке, как и в любом другом параметре, который вы передаете, и он исчезает при выходе из функции.

person Kibbee    schedule 19.01.2011
comment
Я попробовал, но, к сожалению, не сработало. error CS1510: A ref or out argument must be an assignable variable. - person MasterMastic; 24.01.2013