将零参数作为参数传递 - 定义行为的位置?

时间:2010-05-31 07:38:16

标签: c# arguments specifications params

C#规范。允许你调用函数

void foo(params int[] x)

零参数。但是,我没有在C#Lang中找到。规格。关于进一步行为的一个词 - 将foo获取空数组或空引用?我也检查了MSDN - 什么都没有。

定义行为的地方?

注意:我不是在询问VS的行为方式,我在询问该语言的设计。

3 个答案:

答案 0 :(得分:25)

C#语言规范的第7.4.1节

  

特别注意一个空的   当零时创建数组   给出参数的参数   阵列。

它实际上是该部分的最后一行(C# 3.0 spec

答案 1 :(得分:13)

  

17.5.1.4参数数组

     

参数数组允许参数   用a中的两种方式之一指定   方法调用:

  •争论   给出一个参数数组可以是一个   单个表达式的类型   隐式可兑换(§13.1)到   参数数组类型。在这种情况下,   参数数组精确地起作用   像一个值参数。

  或者,调用可以   指定零个或多个参数   参数数组,其中每个参数   是一种类型的表达式   隐式可兑换(§13.1)到   参数数组的元素类型。   在这种情况下,调用创建   参数数组的一个实例   类型的长度对应于   参数的数量,初始化   数组实例的元素   使用给定的参数值,和   使用新创建的数组实例   作为实际的论点。

在同一部分中给出了一个例子:

using System;
class Test
{
    static void F(params int[] args) {
        Console.Write("Array contains {0} elements:", args.Length);
        foreach (int i in args)
            Console.Write(" {0}", i);
        Console.WriteLine();
    }

    static void Main() {
        int[] arr = {1, 2, 3};
        F(arr);
        F(10, 20, 30, 40);
        F();
    }
}

产生输出

Array contains 3 elements: 1 2 3 Array
contains 4 elements: 10 20 30 40 Array
contains 0 elements:

此示例说明了预期的行为:空数组

答案 2 :(得分:0)

对于被调用者,它等于void foo(int[] x),并且传递n参数将为您提供具有n元素的数组。所以零参数将被转换为int [0]。