将零参数作为参数传递——行为是在哪里定义的?

Posted

技术标签:

【中文标题】将零参数作为参数传递——行为是在哪里定义的?【英文标题】:Passing zero arguments as params -- where the behaviour is defined? 【发布时间】:2011-02-25 21:21:03 【问题描述】:

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

void foo(params int[] x)

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

行为是在哪里定义的?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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:

这个例子说明了预期的行为:空数组

【讨论】:

【参考方案3】:

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

特别要注意一个空的 数组为零时创建 为参数给出的参数 数组。

这是本节的最后一行

【讨论】:

MS 很好地隐藏了这个信息,我检查了参数部分 ;-) 非常感谢。 解决此问题的一种方法:创建具有零参数的构造函数/方法的重载版本。例如:void foo()void foo(params int[] x) 谢谢。这是一个指向安东尼所指内容的新链接。 Argument lists -> run time evaluation of argument lists

以上是关于将零参数作为参数传递——行为是在哪里定义的?的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp中的函数怎么传多个参数

c# 请问数组能作为参数传递吗? 如果可以如何传递呢?

结构体作为函数参数值传递的问题

Spring Data JPA - 将列名和值作为参数传递

java字符串数组作为参数传递oracle存储过程

VBA传两个参数报错