Non, mais vous pouvez utiliser un délégué (par exemple Action
) comme alternative.
Inspiré en partie par la réponse de Robin R face à une situation où je pensais que je voulais un paramètre de sortie facultatif, j'ai plutôt utilisé un Action
délégué. J'ai emprunté son exemple de code à modifier pour l'utiliser Action<int>
afin de montrer les différences et les similitudes:
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);
}
Cela a l'avantage que la variable facultative apparaît dans la source comme un entier normal (le compilateur l'enveloppe dans une classe de fermeture, plutôt que nous l'enveloppons explicitement dans une classe définie par l'utilisateur).
La variable a besoin d'une initialisation explicite car le compilateur ne peut pas supposer que le Action
sera appelé avant la fin de l'appel de fonction.
Il ne convient pas à tous les cas d'utilisation, mais a bien fonctionné pour mon cas d'utilisation réel (une fonction qui fournit des données pour un test unitaire et où un nouveau test unitaire devait accéder à un état interne non présent dans la valeur de retour).