我有一个使用params关键字的方法,如下所示:
private void ParamsMethod(params string[] args)
{
// Etc...
}然后,我使用各种参数组合调用该方法:
// Within the method, args is...
ParamsMethod(); // - a string array with no elements
ParamsMethod(null); // - null (Why is this?)
ParamsMethod((string)null); // - a string array with one element: null
ParamsMethod(null, null); // - a string array with two elements: null and null
ParamsMethod("s1"); // - a string array with one element: "s1"
ParamsMethod("s1", "s2"); // - a string array with two elements: "s1" and "s2"我理解所有的案例,除了第二个案例。谁能解释一下为什么ParamsMethod(null)会导致args为null,而不是一个只有一个空元素的数组?
发布于 2012-01-27 05:48:48
params参数只是为了提供一种方便的指定值的方法--您仍然可以直接传递数组引用。
现在,null可以转换为string[]或string,所以这两种解释都是有效的-它取决于首选的规范。该规范在第10.6.1.4节中规定:
完全相同
换句话说,编译器首先检查参数作为“正常”参数类型是否有效,只有在绝对必要的情况下才构建数组。
发布于 2012-01-27 05:50:42
请参阅C#规范的10.6.1.4节参数数组
参数数组允许在方法调用中以两种方式之一指定参数:
由于null可以隐式转换为string[],因此它将用作数组。
此外:
在执行重载解析时,具有参数数组的方法可能适用于其标准形式或扩展形式(§7.5.3.1)。仅当方法的范式不适用,并且尚未在同一类型中声明具有与展开形式相同的签名的方法时,方法的展开形式才可用。
这澄清了编译器确实首先尝试使用带有数组参数的方法(标准形式),然后才尝试将参数用作数组元素(扩展形式)。
发布于 2012-01-27 05:48:57
这样做的原因是您可以将适当类型的数组传递给params参数。由于null可以转换为任何类型,并且优先使用数组语法,因此可以将null作为参数的值。
当然,显式地将其转换为string会使其成为数组的一个元素,而不是数组本身。
你可以试一试,看看:
private void DoSomething(params IEnumerable[] arr) {
// ...
}
...
DoSomething(new IEnumerable[] {new int[] {}}); // arr[0] isn't IEnumerable[], it's int[].And here's an online demo.
https://stackoverflow.com/questions/9025842
复制相似问题