C#中的可选数组参数

30

可能重复:
如何在C#中将空数组作为可选参数的默认值传递

我有一个方法长得像下面这样。目前,参数tags不是可选的。

void MyMethod(string[] tags=null)
{
   tags= tags ?? new string[0];
   /*More codes*/
}

我希望使参数tags可选,类似中的方法签名可以设置默认值来使参数可选。我尝试了以下方法但都没有成功。

不起作用的代码-1

void MyMethod(string[] tags=new string[0]){}

不能工作的代码 - 2

void MyMethod(string[] tags={}){}
请建议我缺少什么。
我已经看过这个问题:

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


2
在这种特定情况下,您可以使用C#3.0兼容的void MyMethod(params string[] tags) - sehe
1
tags = tags ?? new string[0]; 这段代码有什么问题呢?如果你已经看过这个问题,接受的答案明确说明了你不能使用C# 4语法来设置默认值,而你可以像你现在这样使用??运算符。 - BoltClock
“string[] tags=null”有什么问题吗?它是可以工作的。 - H H
2
@Rusi Nova:如果你设置了一个默认值为null,那么它就是可选的。 - BoltClock
4
@RusiNova,我们可能使用了不同的“可选”定义。要明确的是,就语言而言,“void Foo(string[] tags = null)”确实使得调用者提供参数成为可选项。但是,在你的方法中是否可以使用null值是另一回事。 - Anthony Pegram
显示剩余3条评论
2个回答

49

可选参数的文档中写道:

默认值必须是以下表达式类型之一:

  • 常量表达式;

  • 形如 new ValType() 的表达式,其中 ValType 是一个值类型,例如 enum 或者 struct

  • 形如 default(ValType) 的表达式,其中 ValType 是一个值类型。

因为 new string[0] 不是常量表达式,也不是跟着一个值类型的 new 语句,所以它不能用作默认参数值。

你问题中的第一个代码段的确是一个好的解决方法:

void MyMethod(string[] tags = null)
{
   tags = tags ?? new string[0];
   // Now do something with 'tags'...
}

+1。解决方法在重复问题的被接受答案中建议。 - BoltClock
1
这是正确的,但如果你使用MyMethod(params Object[] parameterName),你可以省略params数组,编译器将为你传递一个空数组。 MyMethod()同样可以正常工作。 - jwize
因为提供了相关的权威文档链接和内联,所以我点赞了。"授人以鱼不如授人以渔..." - aaronsnoswell

5

不确定我是否理解它的工作原理。

  static void Main(string[] args)
        {
                TestMe();

        }


private static void TestMe(string[] param = null)
    {
        if (param == null)
        { 
            Console.WriteLine("its empty");
        }
    }

另外,param 的值必须是编译时常量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接