Não, mas você pode usar um delegado (por exemplo, Action
) como alternativa.
Inspirado em parte pela resposta de Robin R ao enfrentar uma situação em que pensei que queria um parâmetro opcional de saída, usei um Action
delegado. Emprestei seu código de exemplo para modificá-lo para uso Action<int>
, a fim de mostrar as diferenças e semelhanças:
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);
}
Isso tem a vantagem de a variável opcional aparecer na fonte como um int normal (o compilador a agrupa em uma classe de fechamento, em vez de agrupá-la explicitamente em uma classe definida pelo usuário).
A variável precisa de inicialização explícita porque o compilador não pode assumir que o Action
chamada será antes da saída da chamada da função.
Não é adequado para todos os casos de uso, mas funcionou bem para o meu caso de uso real (uma função que fornece dados para um teste de unidade e onde um novo teste de unidade precisava de acesso a algum estado interno não presente no valor de retorno).