नहीं, लेकिन आप 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);
}
इसका यह लाभ है कि स्रोत में एक सामान्य इंट के रूप में वैकल्पिक चर दिखाई देता है (कंपाइलर इसे क्लोजर क्लास में लपेटता है, बजाय इसके कि हम इसे उपयोगकर्ता-निर्धारित कक्षा में स्पष्ट रूप से लपेटें)।
चर को स्पष्ट रूप से आरंभ करने की आवश्यकता है क्योंकि कंपाइलर यह नहीं मान सकता है कि Action
फ़ंक्शन कॉल से बाहर निकलने से पहले कॉल किया जाएगा।
यह सभी उपयोग के मामलों के लिए उपयुक्त नहीं है, लेकिन मेरे वास्तविक उपयोग के मामले के लिए अच्छी तरह से काम किया है (एक फ़ंक्शन जो एक इकाई परीक्षण के लिए डेटा प्रदान करता है, और जहां एक नए यूनिट परीक्षण के लिए कुछ आंतरिक स्थिति तक पहुंच की आवश्यकता होती है जो रिटर्न वैल्यू में मौजूद नहीं है)।