19

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

void foo(params int[] x)

零参数。但是,我在 C# Lang 中没有找到。规格。关于进一步行为的一句话—— foo 会得到空数组或空引用吗?我还检查了 MSDN——什么都没有。

行为在哪里定义?

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

4

3 回答 3

31

C# 语言规范的第 7.4.1 节(参考:C# 3.0 规范

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

这是该部分的最后一行

于 2010-05-31T07:50:04.267 回答
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();
    }
}

产生输出

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

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

于 2010-05-31T07:48:39.387 回答
0

对于被调用者,它等于void foo(int[] x)并且传递参数将为您提供一个包含元素n的数组。n因此零参数将被转换为 int[0]。

于 2010-05-31T07:41:49.773 回答