将空数组作为可选参数的默认值传递

Man*_*ndo 81 c# default-value optional-parameters

如何定义一个将带有空数组的可选数组作为默认值的函数?

public void DoSomething(int index, ushort[] array = new ushort[] {},
 bool thirdParam = true)
Run Code Online (Sandbox Code Playgroud)

结果是:

'array'的默认参数值必须是编译时常量.

ang*_*son 119

您无法创建对象引用的编译时常量.

您可以使用的唯一有效编译时常量是 null,所以将代码更改为:

public void DoSomething(int index, ushort[] array = null,
  bool thirdParam = true)
Run Code Online (Sandbox Code Playgroud)

在你的方法里面这样做:

array = array ?? new ushort[0];
Run Code Online (Sandbox Code Playgroud)

  • 是的,你没有修复你实际上收到"null"的情况,你是否使用了我的答案中的第二个陈述? (4认同)
  • 是的,这确实浮现在脑海中,除了传递null与空数组不同.我希望有一种方法可以做到这一点,而无需在方法内穿着参数.关于对象引用的ompile-time常量的一点是有道理的.谢谢! (3认同)

chk*_*hkn 21

如果你可以将数组作为最后一个参数,你也可以这样做:

public void DoSomething(int index, bool wasThirdParam = true, params ushort[] array)
Run Code Online (Sandbox Code Playgroud)

如果未指定空编译器,编译器将自动传递一个空数组,并且您可以更灵活地将数组作为单个参数传递,或者将元素作为可变长度参数直接放入方法中.


Dar*_*ius 6

我知道这是一个老问题,虽然这个答案并没有直接解决如何解决编译器强加的限制,但方法重载是另一种选择:

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

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

      ...
   }
Run Code Online (Sandbox Code Playgroud)