为什么这段代码正在编译?

时间:2013-12-25 15:38:03

标签: c# params-keyword

假设我定义了一个这样的方法:

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关键字时,幕后会发生什么?

3 个答案:

答案 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关键字   方法声明。