2010-10-16 92 views
51

如何創建一個具有可選參數和參數的方法?C#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(如你收到C#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

是的,這是完成OP要求我知道的唯一方法。我認爲這不一定是壞事。只需創建一些更多的代碼,但它很簡單,不會混淆。 – jlafay 2011-02-09 20:29:59

+7

另外,這對於方法調用者信息屬性不起作用,例如'[CallerMemberName]'。 – 2013-06-07 03:49:30

+0

這是可能的,看到我的回答在 – katbyte 2013-12-18 23:23:47

11

嘗試

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

,對於例如效果很好。但是當我需要這樣的簽名時,我有義務指定類型。公共靜態無效TestOptional (T A,INT B = 0,則params動作 [] C) – MichaelD 2010-10-16 13:15:33

+0

@MichaelD所以你不喜歡寫類似於: 動作測試= X => Console.WriteLine(X); Action test2 = y => Console.WriteLine(y); TestOptional(「A」,C:new [] {test,test2}); 我理解正確嗎?或者你的意思是? – 2010-10-16 18:03:44

+0

使用你的方法和我以前評論過的簽名。解析器需要類型'new Action []'ant不只是'new []'。處理泛型類型的表達式時,這會導致很多'代碼噪聲'。簡單簽名示例:TestOptional(「A」,C:new Action [] {d => d.ToString(),d => d.ToString()}); – MichaelD 2010-10-16 18:23:41

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

這不符合OP的簽名。 'B'現在是一個可以爲空的字符串。此外,這個答案將'C'改爲一個對象。這是另一個問題的答案。類型很重要。 – CodeMonkeyKing 2013-12-20 00:18:52

+1

問題是「我如何創建一個具有可選參數和參數的方法?」我的答案顯示瞭如何去做。然而,是的,我使用不同的類型,因爲我試圖完成不同的事情。很容易改變類型匹配。 – katbyte 2013-12-20 01:11:32

+1

是的,這將工作。它增加了新的[] {}的混亂,這不完全是你想要寫的,因爲大多數情況下你永遠不需要用params來做這件事,事實上,它是意想不到的。 OP的問題說明編譯器不能在調用站點使用params語法來推斷一個已命名的'params'參數。 – CodeMonkeyKing 2013-12-20 01:26:59