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