Nie, ale możesz użyć delegata (np. Action) Jako alternatywy.
Zainspirowany częściowo odpowiedzią Robin R, gdy stanąłem przed sytuacją, w której myślałem, że chcę opcjonalnego parametru wyjściowego, zamiast tego użyłem Actiondelegata. Pożyczałem jego przykładowy kod do modyfikacji w celu użycia Action<int>w celu pokazania różnic i podobieństw:
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);
}
Ma to tę zaletę, że opcjonalna zmienna pojawia się w źródle jako normalna int (kompilator otacza ją klasą zamknięcia, a nie zawija ją jawnie w klasie zdefiniowanej przez użytkownika).
Zmienna wymaga jawnej inicjalizacji, ponieważ kompilator nie może założyć, że Actionzostanie wywołany przed zakończeniem wywołania funkcji.
Nie nadaje się do wszystkich przypadków użycia, ale działał dobrze w moim prawdziwym przypadku użycia (funkcja, która zapewnia dane do testu jednostkowego, a nowy test jednostkowy wymagał dostępu do niektórych stanów wewnętrznych nieobecnych w wartości zwracanej).