2010-08-13 5 views
60

Wie definiert man eine Funktion, die ein optionales Array mit einem leeren Array als Standard verwendet?Übergeben eines leeren Arrays als Standardwert eines optionalen Parameters

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

Ergebnisse in:

Standard-Parameterwert für 'Array' muss ein Kompilierung-Konstante sein.

+1

Dies ist kein Duplikat. Es fragt spezifisch, wie man einen Standardwert für ein Array und nicht für einen String festlegt. Es gibt einen echten Unterschied in den Ansätzen – Darren

Antwort

91

Sie können keine Konstanten für die Kompilierzeit von Objektreferenzen erstellen.

Die einzige gültige Kompilierung-Konstante, die Sie verwenden können, ist null, so dass Ihr Code dies ändern:

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

Und in Ihrem Methode dies zu tun:

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

Ja, das kommt mir in den Sinn, außer die Übergabe von null ist nicht dasselbe wie ein leeres Array. Ich hatte auf einen Weg gehofft, ohne den Param innerhalb der Methode zu kleiden. Das bisschen über ompile-time-Konstanten von Objektreferenzen macht Sinn. Vielen Dank! – MandoMando

+0

, die ArgumentNullException wirft, weiß jemand warum? – Ayyash

+2

Ja, Sie beheben nicht den Fall, dass Sie tatsächlich "null" erhalten, haben Sie die zweite Aussage aus meiner Antwort verwendet? –

15

Wenn Sie das machen Array das letzte Argument Sie könnten dies auch tun:

Der Compiler wird Übergeben Sie automatisch ein leeres Array, wenn es nicht angegeben ist, und Sie erhalten die zusätzliche Flexibilität, ein Array entweder als einzelnes Argument zu übergeben oder die Elemente direkt als Argumente mit variabler Länge in Ihre Methode einzufügen.

3

Ich weiß, es ist eine alte Frage, und während dieser Antwort nicht direkt zu lösen, wie um die Einschränkungen durch den Compiler auferlegt zu bekommen, ist Methode Überlastung eine Alternative:

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

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

     ... 
    } 
+0

Ich bin nicht sicher, ob ein Compiler dann eine gegenseitige Rekursion anstelle eines gewöhnlichen * ableiten und optimieren könnte (obwohl ja, weiß ich zB, dass es eine Option '-optimize-sibling-calls' in g ++ gibt, aber es ist C++, ich bin nicht sicher, ob C# -Compiler das können) *. –