将空数组作为可选参数的默认值传递[重复]
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#编译器是否可以).以上是关于将空数组作为可选参数的默认值传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章