Нет, но вы можете использовать делегата (например, Action
) в качестве альтернативы.
Вдохновленный ответом Робина Р., когда я столкнулся с ситуацией, когда я думал, что хочу дополнительный параметр out, вместо этого яиспользовал делегат Action
.Я заимствовал его пример кода, чтобы изменить его для использования Action<int>
, чтобы показать различия и сходства:
public string foo(string value, Action<int> outResult = null)
{
// .. do something
outResult?.Invoke(100);
return value;
}
public void bar ()
{
string str = "bar";
string result;
int optional = 0;
// example: call without the optional out parameter
result = foo (str);
Console.WriteLine ("Output was {0} with no optional value used", result);
// example: call it with optional parameter
result = foo (str, x => optional = x);
Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
// example: call it with named optional parameter
foo (str, outResult: x => optional = x);
Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
}
Это имеет то преимущество, что дополнительная переменная появляется в источнике как обычное целое (компилятор оборачивает его в класс замыкания, а не мы явно оборачиваем его в пользовательский класс).
Переменная нуждается в явной инициализации, поскольку компилятор не может предполагать, что Action
будет вызван перед функциейвызовы выходов.
Это подходит не для всех вариантов использования, но хорошо работает для моего реального случая использования (функция, которая предоставляет данные для модульного теста, и где новому модульному тесту необходим доступ к некоторому внутреннему состоянию, которого нетв возвращаемом значении).