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

gre*_*man 17 c# arguments specifications params

C#规范 允许你调用一个函数

void foo(params int[] x)
Run Code Online (Sandbox Code Playgroud)

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

行为定义在哪里?

注意:我不是在询问VS的行为,我在询问语言的设计.

Ant*_*ram 27

C#语言规范的第7.4.1节

特别要注意,当为参数数组提供零参数时,会创建一个空数组.

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


Dar*_*rov 13

17.5.1.4参数数组

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

•为参数数组提供的参数可以是可隐式转换(第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();
    }
}
Run Code Online (Sandbox Code Playgroud)

产生输出

Array contains 3 elements: 1 2 3 Array
contains 4 elements: 10 20 30 40 Array
contains 0 elements:
Run Code Online (Sandbox Code Playgroud)

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