2010-10-16 6 views
51

मैं एक विधि कैसे बना सकता हूं जिसमें वैकल्पिक पैरामीटर और पैरा एक साथ हो?सी # 4.0, वैकल्पिक पैरामीटर और पैराम एक साथ काम नहीं करते

static void Main(string[] args) 
{ 

    TestOptional("A",C: "D", "E");//this will not build 
    TestOptional("A",C: "D"); //this does work , but i can only set 1 param 
    Console.ReadLine(); 
} 

public static void TestOptional(string A, int B = 0, params string[] C) 
{ 
    Console.WriteLine(A); 
    Console.WriteLine(B); 
    Console.WriteLine(C.Count()); 
} 

उत्तर

33

हैं तो आपको प्रयास करें अभी TestOptional ओवरलोड है (के रूप में आप से पहले सी # 4 करना था)। पसंद नहीं किया गया है, लेकिन यह उपयोग के बिंदु पर कोड को साफ करता है।

public static void TestOptional(string A, params string[] C) 
{ 
    TestOptional(A, 0, C); 
} 

public static void TestOptional(string A, int B, params string[] C) 
{ 
    Console.WriteLine(A); 
    Console.WriteLine(B); 
    Console.WriteLine(C.Count()); 
} 
+1

हां, ओपी यह पूछने का यही एकमात्र तरीका है जिसे मैं जानता हूं। मुझे नहीं लगता कि यह जरूरी है कि यह बुरा है। बस थोड़ा और कोड बनाता है लेकिन यह भ्रमित नहीं होने के लिए काफी आसान है। – jlafay

+7

इसके अलावा, यह विधि कॉलर सूचना विशेषताओं, जैसे कि '[कॉलरमेम्बरनाम]' के लिए काम नहीं करता है। –

+0

यह संभव है, – katbyte

11

TestOptional("A", C: new []{ "D", "E"}); 
+0

कि उदाहरण के लिए अच्छी तरह से काम करता है। लेकिन जब मुझे इस तरह के हस्ताक्षर की आवश्यकता होगी, तो मैं इस प्रकार को निर्दिष्ट करने के लिए बाध्य हूं। public static void TestOptional ताकि आप पसंद नहीं (टी ए, बी पूर्णांक = 0, परम लड़ाई [] सी) – MichaelD

+0

@MichaelD लिखने समान करने के लिए: कार्रवाई परीक्षण = x => Console.WriteLine (x); एक्शन test2 = y => कंसोल। राइटलाइन (वाई); टेस्टऑप्शनल ("ए", सी: नया [] {परीक्षण, test2}); क्या मैं सही ढंग से समझता हूं या आपका क्या मतलब है? –

+0

आपकी विधि और हस्ताक्षर का उपयोग करके मैंने पहले टिप्पणी की थी। पार्सर को 'नई एक्शन []' चींटी की आवश्यकता है 'न केवल' नया [] '। जेनेरिक प्रकारों के अभिव्यक्तियों से निपटने के दौरान इसका परिणाम 'कोड-शोर' होता है। सरल हस्ताक्षर पर उदाहरण: टेस्टऑप्शनल ("ए", सी: नई एक्शन [] {डी => डी। टॉस्ट्रिंग(), डी => डी। टॉस्ट्रिंग()}); – MichaelD

8

यह मेरे लिए काम किया:

static void Main(string[] args) { 

     TestOptional("A"); 
     TestOptional("A", 1); 
     TestOptional("A", 2, "C1", "C2", "C3"); 

     TestOptional("A", B:2); 
     TestOptional("A", C: new [] {"C1", "C2", "C3"}); 

     Console.ReadLine(); 
    } 

    public static void TestOptional(string A, int B = 0, params string[] C) { 
     Console.WriteLine("A: " + A); 
     Console.WriteLine("B: " + B); 
     Console.WriteLine("C: " + C.Length); 
     Console.WriteLine(); 
    } 
+1

से नीचे मेरा उत्तर देखें यह ओपी के हस्ताक्षर से मेल नहीं खाता है। 'बी' अब एक स्ट्रिंग है जो शून्य हो सकती है। इसके अलावा इस जवाब ने 'सी' को किसी ऑब्जेक्ट में बदल दिया। यह एक अलग सवाल का जवाब है। प्रकार मायने रखता है। – CodeMonkeyKing

+1

सवाल यह था कि "मैं एक विधि कैसे बना सकता हूं जिसमें वैकल्पिक पैरामीटर और पैरा एक साथ हो?" और मेरे जवाब से पता चला कि ऐसा कैसे करें। हालांकि हाँ मैंने विभिन्न प्रकारों का उपयोग किया क्योंकि मैं कुछ अलग करने की कोशिश कर रहा था। मिलान करने के लिए प्रकारों को बदलने के लिए काफी आसान है। – katbyte

+1

हाँ यह काम करेगा। यह नए [] {} के अव्यवस्था को जोड़ता है, जो बिल्कुल नहीं है कि आप इसे कैसे लिखना चाहते हैं कि अधिकांश समय आपको कभी भी पैराम के साथ ऐसा नहीं करना पड़ता है, वास्तव में ऐसा करने के लिए अप्रत्याशित होता है। ओपी का सवाल बताता है कि संकलक कॉलिंग साइट पर पैराम सिंटैक्स का उपयोग करके नामित 'पैराम' पैरामीटर का अनुमान नहीं लगा सकता है। – CodeMonkeyKing