C# - 是否可以使用空参数?

mic*_*ael 53 c# parameters params

public void Foo(params string[] values)
{
}
Run Code Online (Sandbox Code Playgroud)

有可能valuesnull,或者总是设置0或更多的项目?

Jon*_*eet 68

绝对 - 您可以使用类型为string []的参数调用它,其值为null:

string[] array = null;
Foo(array);
Run Code Online (Sandbox Code Playgroud)

  • @sehe:问题中没有任何内容表明这一点.OP只询问`values`是否可能为null - 而不是如果你没有任何参数调用它会发生什么. (3认同)
  • @Schroedingers,你错了。传递 null 代替 params 数组将创建一个 null 引用数组。仅当您在 * 或 * 完全省略方法调用中的参数中显式传递一个时,才会创建零长度数组。必须显式创建单个空元素的数组。 (2认同)

Jos*_*ers 37

我决定编写一些代码来为自己测试这个.使用以下程序:

using System;

namespace TestParams
{
    class Program
    {
        static void TestParamsStrings(params string[] strings)
        {
            if(strings == null)
            {
                Console.WriteLine("strings is null.");
            }
            else
            {
                Console.WriteLine("strings is not null.");
            }
        }

        static void TestParamsInts(params int[] ints)
        {
            if (ints == null)
            {
                Console.WriteLine("ints is null.");
            }
            else
            {
                Console.WriteLine("ints is not null.");
            } 
        }

        static void Main(string[] args)
        {
            string[] stringArray = null;

            TestParamsStrings(stringArray);
            TestParamsStrings();
            TestParamsStrings(null);
            TestParamsStrings(null, null);

            Console.WriteLine("-------");

            int[] intArray = null;

            TestParamsInts(intArray);
            TestParamsInts();
            TestParamsInts(null);
            //TestParamsInts(null, null); -- Does not compile.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

产生以下结果:

strings is null.
strings is not null.
strings is null.
strings is not null.
-------
ints is null.
ints is not null.
ints is null.
Run Code Online (Sandbox Code Playgroud)

所以,是的,与params相关联的数组完全可能为null.


cod*_*nix 5

我的第一个猜测是声明默认值为 null 的参数,这在某些情况下是有意义的,但 c# 语言不允许这样做。

static void Test(params object[] values = null) // does not compile
{
}
Run Code Online (Sandbox Code Playgroud)

错误 CS1751:无法指定参数数组的默认值

通过显式传递 null 来绕过此限制的方法已经得到解答。