C#-是否可能有空参数?

C#-是否可能有空参数?,c#,parameters,params,C#,Parameters,Params,值是否可能永远为null,或者是否总是使用0或更多项进行设置?绝对-您可以使用字符串[]类型的参数调用它,参数值为null: public void Foo(params string[] values) { } 除了Jon的答案,你还可以有这样的答案: string[] array = null; Foo(array); 我决定自己写一些代码来测试这个。使用以下程序: string[] array1 = new string[]; //array is not null, but empt

是否可能永远为
null
,或者是否总是使用
0
或更多项进行设置?

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

public void Foo(params string[] values)
{
}

除了Jon的答案,你还可以有这样的答案:

string[] array = null;
Foo(array);

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

string[] array1 = new string[]; //array is not null, but empty
Foo(array1);
string[] array2 = new string[] {null, null}; //array has two items: 2 null strings
Foo(array2);
结果如下:

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.
        }
    }
}

因此,是的,与参数关联的数组完全可能为null。

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

strings is null.
strings is not null.
strings is null.
strings is not null.
-------
ints is null.
ints is not null.
ints is null.
错误CS1751:无法为参数数组指定默认值


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

我不知道如何将null传递给该函数并将其赋值。我想我是在问“有可能做到吗?”
Foo(null)
可能值得一试。“试试看”几乎没有给出明确的答案。
params
方法可以通过多种方式调用,这是一个有效的问题。假设您还有一个额外的重载“public void Foo(object value){}”,并调用“Foo(null)”--您认为现在会发生什么,为什么?试一试--你说得对吗?@johnsaundersfoo(null)在这种情况下将产生值=string[]{null},Foo((string[])null),将产生值=null,但是。@Schroedingers,你是不正确的。传递null代替params数组将创建null引用数组。只有在方法调用中显式传入或完全忽略参数时,才会创建零长度数组。必须显式创建单个空元素的数组。@Schroedingers、Jon和Anthony是对的。看。如果您传递一个数组引用(包括常规的
null
literal),
value
将正好是这个值。另一方面,如果您传递的字符串引用恰好为null,它将是一个长度为1的数组,就像您所说的那样。@Jon:我(强烈)感觉OP在询问
Foo()
的情况。如果你感兴趣的话,你可以在我现在删除的答案中检查我的推理:)@sehe:问题中没有任何东西表明这一点。OP只询问
值是否可能为空,而不是在没有任何参数的情况下调用它会发生什么情况。@Jon:谢谢你在大多数人都不屑一顾的时候总是提供帮助。很明显,OP(以及我自己)在询问一些不明显的情况,比如它可能是
null
。直到今天,在使用参数之前,我一直检查参数
params
是否为
null
,但从未确认值是否可能为
null
。谢谢你的明确回答。
static void Test(params object[] values = null) // does not compile
{
}