2012-10-05 34 views
11

द्वारा वैकल्पिक तर्क के बाद मैं देखता हूं कि एक विधि हस्ताक्षर होना संभव है जहां पहला पैरामीटर डिफ़ॉल्ट मान प्रदान करता है और दूसरा पैरामीटर एक पैराम संग्रह है।पैराम

जो मैं नहीं देख सकता वह वास्तव में पहले तर्क के डिफ़ॉल्ट मान का उपयोग करने का एक तरीका है।

क्या यह संभव है?

उदाहरण विधि:

void WaitAllTasks(string message = "Running Task.WaitAll", params Task[] tasks);

मैं शुरू में जब विधि बुला संदेश पैरामीटर को छोड़ते हुए की कोशिश की है और यह भी नाम वाले पैरामीटर, जो पैरामीटर साथ काम नहीं करता उपयोग करने की कोशिश।

यह संकलित करता है, लेकिन क्या इसका उपयोग करना संभव है?

उत्तर

23

मैं पहली पैरामीटर के लिए एक मूल्य निर्धारित किए बिना ही विधि बुला के तीन तरीके पा सकते हैं:

using System; 

class Test 
{ 
    static void PrintValues(string title = "Default", 
          params int[] values) 
    { 
     Console.WriteLine("{0}: {1}", title, 
          string.Join(", ", values)); 
    } 

    static void Main() 
    { 
     // Explicitly specify the argument name and build the array 
     PrintValues(values: new int[] { 10, 20 }); 
     // Explicitly specify the argument name and provide a single value 
     PrintValues(values: 10); 
     // No arguments: default the title, empty array 
     PrintValues(); 
    } 
} 

मैं स्पष्ट रूप से हालांकि सरणी के निर्माण के बिना एकाधिक मानों को निर्दिष्ट करने का एक तरीका नहीं मिला है ...

+0

प्रतिबिंब के बारे में क्या? – Servy

+0

@ सर्वी: नहीं, प्रतिबिंब आपको सभी तर्कों को निर्दिष्ट करने की आवश्यकता होगी। –

+1

यह अजीब बात है कि सी # कंपाइलर 'मानों का उपयोग करने की अनुमति नहीं देता है: {10,20}' या 'मान: (10,20)'। मैंने काफी खोज की और ऐसा लगता है कि आपका रास्ता सबसे अच्छा तरीका है। – gdoron