web-dev-qa-db-ja.com

オプションのパラメーターのデフォルト値として空の配列を渡す

デフォルトとして空の配列を持つオプションの配列を取る関数をどのように定義しますか?

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

結果:

'array'の既定のパラメーター値は、コンパイル時の定数でなければなりません。

76
MandoMando

オブジェクト参照のコンパイル時定数を作成することはできません。

使用できる有効なコンパイル時定数はnullのみなので、コードを次のように変更します。

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

そして、メソッド内でこれを行います:

array = array ?? new ushort[0];

配列を最後の引数にできる場合は、これも実行できます。

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

コンパイラーは、指定されていない場合、空の配列を自動的に渡します。配列を単一の引数として渡すか、メソッドへの可変長引数として要素を直接配置する柔軟性が得られます。

20
chkn

私はそれが古い質問であることを知っています、そしてこの答えはコンパイラによって課せられた制限を回避する方法を直接解決しませんが、メソッドのオーバーロードは代替です:

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

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

      ...
   }
5
Darius