107

How does one define a function that takes an optional array with an empty array as default?

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

results in:

Default parameter value for 'array' must be a compile-time constant.

colinfang
  • 20,909
  • 19
  • 90
  • 173
MandoMando
  • 5,215
  • 4
  • 28
  • 35
  • 10
    This is not a duplicate. It is specific in asking how to set a default value for an array, not a string. There is a real difference in approaches –  Feb 02 '18 at 09:49

3 Answers3

160

You can't create compile-time constants of object references.

The only valid compile-time constant you can use is null, so change your code to this:

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

And inside your method do this:

array = array ?? new ushort[0];

(from comments) From C# 8 onwards you can also use the shorter syntax:

array ??= new ushort[0];
Lasse V. Karlsen
  • 380,855
  • 102
  • 628
  • 825
28

If you can make the array the last argument you could also do this:

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

The compiler will automatically pass an empty array if it is not specified, and you get the added flexibility to either pass an array as a single argument or put the elements directly as variable length arguments to your method.

chkn
  • 647
  • 7
  • 14
7

I know it's an old question, and whilst this answer doesn't directly solve how to get around the limitations imposed by the compiler, method overloading is an alternative:

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

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

      ...
   }
Darius
  • 5,180
  • 5
  • 47
  • 62
  • I am not sure whether a compiler could then infer and optimize a mutual recursion instead of an usual *(though yes, I know e.g. there is an option `-foptimize-sibling-calls` in g++, but it is C++, I am not sure whether C# compilers can it)*. – Hi-Angel Jun 02 '15 at 10:32