【问题标题】: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' 的默认参数值必须是编译时常量。

【问题讨论】:

  • 这不是重复的。它专门询问如何为数组而不是字符串设置默认值。方法确实存在差异

标签: c# default-value optional-parameters


【解决方案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#编译器是否可以).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2022-01-14
    • 2011-04-15
    • 2021-05-16
    相关资源
    最近更新 更多