19

C#仕様。関数を呼び出すことができます

void foo(params int[] x)

パラメータがゼロの場合。ただし、C#Langでは見つかりませんでした。スペック さらなる振る舞いについての一言-fooは空の配列またはnull参照を取得しますか?MSDNもチェックしました-何もありません。

動作はどこで定義されていますか?

:私はVSがどのように動作するかを尋ねているのではなく、言語の設計について尋ねています。

4

3 に答える 3

31

C#言語仕様のセクション7.4.1(参照:C#3.0仕様

特に、パラメータ配列に引数がゼロの場合、空の配列が作成されることに注意してください。

セクションの最後の行です

于 2010-05-31T07:50:04.267 に答える
13

17.5.1.4パラメータ配列

パラメータ配列を使用すると、メソッド呼び出しで2つの方法のいずれかで引数を指定できます。

•パラメータ配列に指定する引数は、パラメータ配列型に暗黙的に変換可能な(§13.1)型の単一式にすることができます。この場合、パラメーター配列は値パラメーターとまったく同じように機能します。

•あるいは、呼び出しでパラメーター配列に0個以上の引数を指定できます。各引数は、パラメーター配列の要素型に暗黙的に変換可能な(§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)ます。したがって、ゼロパラメータはint[0]に変換されます。nn

于 2010-05-31T07:41:49.773 に答える