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

发布于 2024-09-03 22:24:22 字数 226 浏览 8 评论 0原文

C# 规范。允许您调用

void foo(params int[] x)

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

行为是在哪里定义的?

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

C# spec. allows you to call a function

void foo(params int[] x)

with zero parameters. However, I didn't find in C# Lang. Spec. a word on further behaviour -- will foo get empty array or null reference? I checked also MSDN -- nothing.

Where the behaviour is defined?

NOTE: I am not asking how VS behaves, I am asking about design of the language.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

春花秋月 2024-09-10 22:24:22

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

特别要注意的是一个空的
当数组为零时创建
为参数指定的参数
数组。

这是本节的最后一行

Section 7.4.1 of the C# Language Specification (ref: C# 3.0 spec)

In particular, note that an empty
array is created when there are zero
arguments given for the parameter
array.

It's the last line of the section

感情洁癖 2024-09-10 22:24:22

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:

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

17.5.1.4 Parameter arrays

A parameter array permits arguments to
be specified in one of two ways in a
method invocation:

• The argument
given for a parameter array can be a
single expression of a type that is
implicitly convertible (§13.1) to the
parameter array type. In this case,
the parameter array acts precisely
like a value parameter.


Alternatively, the invocation can
specify zero or more arguments for the
parameter array, where each argument
is an expression of a type that is
implicitly convertible (§13.1) to the
element type of the parameter array.
In this case, the invocation creates
an instance of the parameter array
type with a length corresponding to
the number of arguments, initializes
the elements of the array instance
with the given argument values, and
uses the newly created array instance
as the actual argument.

In the same section an example is given:

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();
    }
}

produces the output

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

This example illustrates the expected behavior: empty array

撧情箌佬 2024-09-10 22:24:22

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

For the callee it is equal to void foo(int[] x) and passing n parameters will give you an array with n elements. So zero parameters will be translated into an int[0].

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文