将空数组作为可选参数的默认值传递[重复]

Posted

技术标签:

【中文标题】将空数组作为可选参数的默认值传递[重复]【英文标题】:Passing an empty array as default value of an optional parameter [duplicate] 【发布时间】:2011-03-29 15:59:16 【问题描述】:

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

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];

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

array ??= new ushort[0];

【讨论】:

是的,确实想到了,除了传递 null 与空数组不同。我希望有一种方法可以做到这一点,而不必在方法中修饰参数。关于对象引用的编译时常量的一点是有道理的。谢谢! 抛出 ArgumentNullException,有人知道为什么吗? 是的,您并没有解决您实际收到null 的情况,您是否使用了我回答中的第二个陈述? 我只想提一下,C# 8 现在允许使用更漂亮的语法。 array ??= new ushort[0]; 空合并赋值运算符 ??= 在 C# 8 中可用【参考方案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)

      ...
   

【讨论】:

我不确定编译器是否可以推断和优化相互递归而不是通常的 (虽然是的,我知道例如在 g++ 中有一个选项 -foptimize-sibling-calls,但它是C++,我不确定C#编译器是否可以).

以上是关于将空数组作为可选参数的默认值传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3:如何将 cv::Mat 作为可选参数传递

可选字符串数组作为绑定参数 SwiftUI [重复]

JavaScript中的可选参数[重复]

可以在具有默认值(作为可选参数)的参数中分配 const 变量吗?

如何检查是不是设置了可选功能参数

TypeScript 函数