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