2013-02-27 69 views
3

我試圖混合可選參數和可變長度參數關鍵字(使用PARAMS關鍵字):混合可選參數,而params在c#

這裏的函數聲明:

void foo(int req, string opt = "empty", params object[] rest) {} 

這裏是調用該函數:

foo(1); 
foo(1, "something"); 
foo(1, "something", 2, 3); 
foo(1, 2, 3); 

最後一次調用不編譯,因爲參數在省略操作後提供參數。 (至少我認爲這就是爲什麼它不起作用)

如何省略可選參數(opt)並仍然能夠使用可變長度參數(休息)?

編輯:實際上,對C# 4.0, optional parameters and params do not work together的回答不滿足我,因爲在多個可選參數的情況下可能有多種重載組合。

+3

組合這兩種技術的IMO只是讓它比單獨的重載'foo()'方法更容易混淆。 – 2013-02-27 14:48:36

+0

@CAbbott確實如此。我沒有足夠的搜索。 – seb 2013-02-27 15:04:01

+0

您可以儘可能多地編輯它。沒有辦法做到這一點乾淨。我給複本的答案是,這個問題是一個重複的問題,正在尋求一個不同的答案,遠不是最佳的語法,我也沒有聲稱它是。答案是作爲一個可能的工作。 – CodeMonkeyKing 2014-06-06 06:59:27

回答

1

試試這個

 foo(1); 
     foo(1, "something"); 
     foo(1, "something", 2, 3); 
     foo(1, rest: new object[]{2,3 }); 
3

這是一個代碼味道。這樣的事情會更好:

public interface IFooSetup 
{ 
    IReadOnlyList<object> Params{get;} 
    string Opt{get;} 
} 

public class FooSetup : IFooSetup 
{ 
    public IReadOnlyList<object> Params { get; set; } 
    public string Opt { get; set; } 

    public FooSetup() 
    { 
     Opt = "empty"; 
     Params = new List<object>(); 
    } 
} 

public void Foo(int req, IFooSetup setup) 
{ 
} 

你將能夠更容易地模擬你的Foo測試,並嘲笑你的設置。

儘管如此,除非在編譯時絕對無法實現,否則應該使可選參數爲強類型。

+0

我想仍然可以在一行代碼中調用foo。 – seb 2013-02-27 15:17:07

+1

Foo(1,new FooSetup(){Opt =「:)」,Params = new List {new object}}); – 2013-02-27 15:35:08