2010-08-13 68 views
60

如何定義一個將空數組作爲默認值的可選數組的函數?傳遞一個空數組作爲可選參數的默認值

public void DoSomething(int index, ushort[] array = new ushort[] {}, 
bool thirdParam = true) 

結果:關於「陣列」

默認參數值必須是一個編譯時間常數。

+1

這不是重複。具體問題是如何爲數組設置默認值,而不是字符串。在方法 – Darren 2018-02-02 09:49:10

回答

91

您無法創建對象引用的編譯時常量。

唯一有效的編譯時間常數,你可以用的是null,那麼改變你的代碼如下:

public void DoSomething(int index, ushort[] array = null, 
    bool thirdParam = true) 

而且你的方法做這裏面:

array = array ?? new ushort[0]; 
+3

中有一個真正的區別是,這確實讓人想起,除了傳遞null與空數組不一樣。我希望有一種方法可以做到這一點,而不必穿戴方法中的參數。有關對象引用的ompile-time常量的位是有意義的。謝謝!拋出ArgumentNullException的 – MandoMando 2010-08-13 20:37:28

+0

,有人知道爲什麼嗎? – Ayyash 2015-05-12 16:14:41

+2

是的,你沒有解決你實際上收到'null'的情況,你是否使用了我的答案中的第二個陳述? – 2015-05-12 16:16:22

15

如果你可以使array最後一個參數,你也可以這樣做:

public void DoSomething(int index, bool wasThirdParam = true, params ushort[] array) 

編譯器將如果未指定空數組,則會自動傳遞一個空數組,並且可以增加將數組作爲單個參數傳遞的靈活性,或者直接將元素作爲可變長度參數傳遞給您的方法。

3

我知道這是一個老問題,而同時這個答案並不直接解決如何避開由編譯器本身的限制,方法重載是一種替代方案:

public void DoSomething(int index, bool thirdParam = true){ 
     DoSomething(index, new ushort[] {}, thirdParam); 
    } 

    public void DoSomething(int index, ushort[] array, bool thirdParam = true){ 

     ... 
    } 
+0

我不確定編譯器是否可以推斷並優化相互遞歸而不是通常的*(雖然是的,我知道例如在g ++中有一個選項「-foptimize-sibling-calls」,但它是C++,我是不確定C#編譯器是否可以)*。 – 2015-06-02 10:32:35