2010-10-16 18 views
51

Come posso creare un metodo che abbia parametri e parametri opzionali insieme?C# 4.0, parametri e parametri opzionali non funzionano insieme

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()); 
} 

risposta

33

L'unica opzione in questo momento è quello di sovraccaricare il TestOptional (come si doveva fare prima di C# 4). Non preferito, ma pulisce il codice al punto di utilizzo.

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

Sì, questo è l'unico modo per realizzare ciò che l'OP sta chiedendo di sapere. Non penso che sia necessariamente cattivo comunque. Basta creare un po 'più di codice, ma è abbastanza semplice da non confondere. – jlafay

+7

Inoltre, questo non funziona per gli attributi di informazioni sul metodo del chiamante, come '[CallerMemberName]'. –

+0

È possibile, vedere la mia risposta sotto – katbyte

11

Prova

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

che funziona bene per l'esempio. ma quando avrei bisogno di una firma come questa, sono obbligato a specificare il tipo. public static void TestOptional (T A, int B = 0, params azione [] C) – MichaelD

+0

@MichaelD in modo non vi piace scrivere simile a: Action test = x => Console.WriteLine (x); Azione test2 = y => Console.WriteLine (y); TestOptional ("A", C: nuovo [] {test, test2}); Comprendo correttamente o cosa intendi? –

+0

Utilizzo del metodo e della firma precedentemente commentato. Il parser necessita del tipo 'nuova azione []' formica non solo 'nuova []'. Ciò si traduce in molto "code-noise" quando si tratta di espressioni di tipi generici e così via. Esempio sulla firma più semplice: TestOptional ("A", C: nuova azione [] {d => d.ToString(), d => d.ToString()}); – MichaelD

8

questo ha funzionato per me:

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

Questo non corrisponde alla firma che l'OP ha. La 'B' ora è una stringa che può essere nullo. Inoltre questa risposta ha cambiato la "C" in un oggetto. Questa è una risposta a una domanda diversa. I tipi contano. – CodeMonkeyKing

+1

La domanda era "Come posso creare un metodo che ha parametri e parametri opzionali insieme?" e la mia risposta ha mostrato come farlo. Comunque sì ho usato diversi tipi perché stavo cercando di realizzare qualcosa di diverso. Abbastanza facile da modificare i tipi da abbinare. – katbyte

+1

Sì, funzionerà. Aggiunge il disordine del nuovo [] {}, che non è esattamente come vorresti scrivere questo dato che la maggior parte delle volte non devi mai farlo con un param, infatti è inaspettato doverlo fare. La domanda dell'OP mostra che il compilatore non può dedurre un parametro chiamato "params" usando la sintassi params nel sito chiamante. – CodeMonkeyKing

Problemi correlati