2013-02-08 18 views
2

我有這樣的測試代碼:C#函數值

void func1(string a, params string[] p) 
    { 
     func1(a, true, p); 
    } 

    void func1(string a, bool b, params string[] p) 
    { 
     //... 
    } 

    void func2(string a, bool b = true, params string[] p) 
    { 
     //... 
    } 

    void exec() 
    { 
     func1("a", "p1", "p2"); 
     func2("a", "p1", "p2"); 
    } 

func1func2等於?

有沒有錯誤,當我創建func2,但是,當我嘗試使用func2像EXEC(使用可選的值),編譯器顯示錯誤This function has some invalid arguments

我認爲func1func2對於那些會像API一樣使用此功能的人來說是相等的。

這段代碼有什麼問題? 對於具有可選參數值的函數,我可以使用這種方法嗎?

+1

我喜歡這個問題......但是在實際編寫這樣的代碼之前,請三思而後行 - 當您剛剛編寫代碼時,您已經無法推理什麼以及如何調用。想象一下,當別人(甚至你2個月後)將嘗試使用它...你真的不希望在您的編碼規範意見「始終指定所有參數XXXX功能,否則你會得到奇怪的錯誤/不可預知的行爲...「 – 2013-02-08 17:14:17

回答

10

通常,可選參數必須出現在方法聲明的末尾 - 參數數組(例如p這裏)是唯一的例外。但是,當涉及到使用參數,編譯器將假定所有的位置參數都在同一順序的方法聲明...所以你陷入麻煩,如果你想使用的可選性參數數組側。這應該是好的:

func2("a", p: new[] { "p1", "p2" }) 

但個人我只是避開混合參數數組和可選參數。這顯然令人困惑。

相信C#5規範的相關部分是7.5.1.1,其包括:

的功能構件與在其膨脹形式,其中沒有固定的參數發生調用參數數組的位置參數在參數列表中的相同位置處對應於參數數組的元素。

另見7.5.3.1節。這一切都非常複雜......

+0

好的,但關於我的第一個問題,'func1'等於'func2'?我看不出有什麼不同。 – 2013-02-08 17:26:55

+0

@BrunoCroysFelthes:你必須首先定義「平等」的含義。它們顯然不是「平等的」,因爲'func1'有兩個重載,而'func2'只有一個重載。 – 2013-02-08 17:40:08