Nein, aber Sie können Action
alternativ einen Delegaten (z. B. ) verwenden.
Teilweise inspiriert von Robin Rs Antwort in einer Situation, in der ich dachte, ich wolle einen optionalen out-Parameter, habe ich stattdessen einen Action
Delegaten verwendet. Ich habe seinen Beispielcode ausgeliehen, um ihn für die Verwendung zu ändern Action<int>
, um die Unterschiede und Ähnlichkeiten aufzuzeigen:
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);
}
Dies hat den Vorteil, dass die optionale Variable in der Quelle als normales int angezeigt wird (der Compiler umschließt sie in einer Abschlussklasse, anstatt sie explizit in eine benutzerdefinierte Klasse einzuschließen).
Die Variable muss explizit initialisiert werden, da der Compiler nicht davon ausgehen kann, dass die Action
aufgerufen wird, bevor der Funktionsaufruf beendet wird.
Es ist nicht für alle Anwendungsfälle geeignet, hat aber für meinen tatsächlichen Anwendungsfall gut funktioniert (eine Funktion, die Daten für einen Komponententest bereitstellt und für die ein neuer Komponententest Zugriff auf einen internen Status benötigt, der im Rückgabewert nicht vorhanden ist).