Передача пустого массива в качестве значения по умолчанию для необязательного параметра

Как определить функцию, которая по умолчанию принимает необязательный массив с пустым массивом?

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

приводит к:

Значение параметра по умолчанию для 'array' должно быть константой времени компиляции.

Ответ 1

Вы не можете создавать константы времени компиляции ссылок на объекты.

Единственной допустимой константой времени компиляции, которую вы можете использовать, является null, поэтому измените код на это:

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

И внутри вашего метода сделайте следующее:

array = array ?? new ushort[0];

Ответ 2

Если вы можете сделать массив последним аргументом, вы также можете сделать это:

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){

      ...
   }