Нет, но вы можете использовать делегата (например 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
он будет вызван до завершения вызова функции.
Он подходит не для всех вариантов использования, но хорошо работал для моего реального варианта использования (функция, которая предоставляет данные для модульного теста, и где новому модульному тесту необходим доступ к некоторому внутреннему состоянию, отсутствующему в возвращаемом значении).