Ні, але ви можете використовувати делегата (наприклад Action) як альтернативу.
Частково натхненний відповіддю Робіна Р, коли стикався з ситуацією, коли мені здалося, що я хочу необов'язковий параметр, я замість цього використовував 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);
}
Це має перевагу в тому, що необов'язкова змінна відображається у джерелі як звичайний int (компілятор загортає її у клас закриття, а не ми явно загортаємо її у визначений користувачем клас).
Змінна потребує явної ініціалізації, оскільки компілятор не може припустити, що Actionвиклик буде викликаний до виходу функції виклику.
Він не підходить для всіх випадків використання, але добре працював у моєму випадку реального використання (функція, яка надає дані для одиничного тесту, і де для нового тесту одиниці потрібен доступ до якогось внутрішнього стану, який не міститься у зворотному значенні).