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