假设我定义了一个这样的方法:
public static void ListInts(int[] inVals)
{
for (int i = 0; i < inVals.Length; i++)
{
Console.WriteLine("{0}", inVals[i]);
}
}
如果我尝试这样调用它,显然我收到错误并且代码无法编译:
ListInts();
方法'ListInts'有一个参数但用0参数调用
但是当我改变这样的方法定义时:
public static void ListInts(params int[] inVals)
{
for (int i = 0; i < inVals.Length; i++)
{
Console.WriteLine("{0}", inVals[i]);
}
}
没有错误。我很好奇为什么会这样?为什么第二个代码编译没有任何错误?当我们使用params
关键字时,幕后会发生什么?
答案 0 :(得分:4)
您可以在文档中轻松搜索原因。
来自MSDN:
通过使用params关键字,您可以指定采用可变数量参数的方法参数。 您可以发送以逗号分隔的参数列表,这些参数包含在参数声明中指定的类型或指定类型的参数数组中。 您也可以不发送任何参数。如果不发送参数,则params列表的长度为零。 在方法声明中的params关键字之后不允许使用其他参数,并且在方法声明中只允许使用一个params关键字。
答案 1 :(得分:3)
params关键字将函数转换为variadic function。变量函数可以从0到(理论上)无限参数。这就是你的代码编译的原因。 string.Format函数是可变函数的经典示例。
如果要创建必须至少接受一个参数的可变参数函数,可以执行以下操作(在C#中):
int methodname(int arg1, param int[] restOfArgs) {}
此时你将被迫给函数
至少一个参数答案 2 :(得分:2)
MSDN链接
http://msdn.microsoft.com/en-us/library/w5zay9db.aspx
通过使用params关键字,您可以指定一个方法参数 采用可变数量的参数。您可以发送逗号分隔 参数声明中指定的类型的参数列表 或指定类型的参数数组。你也可以发送否 参数。如果不发送参数,则参数列表的长度为 零。在params关键字后面不允许有其他参数 在方法声明中,a中只允许一个params关键字 方法声明。