99

如何定义一个函数,该函数采用一个可选数组和一个空数组作为默认值?

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

结果是:

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

4

3 回答 3

145

您不能创建对象引用的编译时常量。

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

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

在你的方法里面这样做:

array = array ?? new ushort[0];

(来自评论)从 C# 8 开始,您还可以使用更短的语法:

array ??= new ushort[0];
于 2010-08-13T20:22:17.173 回答
27

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

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

如果未指定,编译器将自动传递一个空数组,并且您可以获得额外的灵活性,既可以将数组作为单个参数传递,也可以将元素直接作为可变长度参数传递给您的方法。

于 2013-02-28T20:10:13.043 回答
7

我知道这是一个老问题,虽然这个答案并不能直接解决如何绕过编译器施加的限制,但方法重载是一种替代方法:

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

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

      ...
   }
于 2013-04-05T23:03:17.983 回答