-10

次のようなメソッドを定義するとします。

public static void ListInts(int[] inVals)
{
    for (int i = 0; i < inVals.Length; i++)
    {
         Console.WriteLine("{0}", inVals[i]);
    } 
}

このように呼び出してみると、明らかにエラーが発生し、コードはコンパイルされません。

ListInts();

メソッド 'ListInts' には 1 つのパラメーターがありますが、0 の引数で呼び出されます

しかし、次のようにメソッド定義を変更すると:

public static void ListInts(params int[] inVals)
{
    for (int i = 0; i < inVals.Length; i++)
    {
         Console.WriteLine("{0}", inVals[i]);
    } 
}

エラーはありません。なぜこれが起こっているのか知りたいです。そして、2 番目のコードがエラーなしでコンパイルされるのはなぜですか? paramsキーワードを使用すると、舞台裏で何が起こるでしょうか?

4

3 に答える 3

4

ドキュメントで理由を簡単に検索できます。

MSDNから:

params キーワードを使用すると、可変数の引数を取るメソッド パラメーターを指定できます。パラメーター宣言で指定された型の引数のコンマ区切りリスト、または指定された型の引数の配列を送信できます。引数を送信しないこともできます。引数を送信しない場合、params リストの長さはゼロです。メソッド宣言の params キーワードの後に​​パラメータを追加することはできません。また、メソッド宣言で使用できる params キーワードは 1 つだけです。

于 2013-12-25T15:40:27.520 に答える
3

params キーワードは、関数を可変個引数関数にします。可変個引数関数は、0 から (理論的には) 無限の引数を取ることができます。これが、コードがコンパイルされる理由です。string.Format 関数は、可変引数関数の古典的な例です。

少なくとも 1 つのパラメーターを受け入れる必要がある可変個引数関数を作成する場合は、次の操作を行うことができます (C# の場合)。

   int methodname(int arg1, param int[] restOfArgs) {}

その時点で、関数に少なくとも 1 つの引数を与える必要があります。

于 2013-12-25T15:41:28.613 に答える
2

MSDN リンク

http://msdn.microsoft.com/en-us/library/w5zay9db.aspx

params キーワードを使用すると、可変数の引数を取るメソッド パラメーターを指定できます。パラメーター宣言で指定された型の引数のコンマ区切りリスト、または指定された型の引数の配列を送信できます。引数を送信しないこともできます。引数を送信しない場合、params リストの長さはゼロです。メソッド宣言の params キーワードの後に​​追加のパラメーターは許可されず、メソッド宣言で許可される params キーワードは 1 つだけです。

于 2013-12-25T15:41:53.683 に答える