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

发布于 2024-09-13 22:52:12 字数 201 浏览 8 评论 0原文

如何定义一个函数,该函数接受一个可选数组,默认数组为空数组?

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

结果:

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

How does one define a function that takes an optional array with an empty array as default?

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

results in:

Default parameter value for 'array' must be a compile-time constant.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

香草可樂 2024-09-20 22:52:12

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

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

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

在您的方法中执行以下操作:

array = array ?? new ushort[0];

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

array ??= new ushort[0];

You can't create compile-time constants of object references.

The only valid compile-time constant you can use is null, so change your code to this:

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

And inside your method do this:

array = array ?? new ushort[0];

(from comments) From C# 8 onwards you can also use the shorter syntax:

array ??= new ushort[0];
宣告ˉ结束 2024-09-20 22:52:12

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

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

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

If you can make the array the last argument you could also do this:

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

The compiler will automatically pass an empty array if it is not specified, and you get the added flexibility to either pass an array as a single argument or put the elements directly as variable length arguments to your method.

你与清晨阳光 2024-09-20 22:52:12

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

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

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

      ...
   }

I know it's an old question, and whilst this answer doesn't directly solve how to get around the limitations imposed by the compiler, method overloading is an alternative:

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

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

      ...
   }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文