5

次の 2 つのメソッドを作成するとします。

public void AddScriptToPage(params string[] scripts) { /*...*/ }
public void AddScriptToPage(string href, string elementId) { /*...*/ }

以下のコードで呼び出されるメソッドはどれですか? また、その理由は何ですか?

AddScriptToPage("dork.js", "foobar.js");

コンパイラはどのメソッドを呼び出すかをどのように決定しますか?

4

2 に答える 2

8

2 番目のメソッドが呼び出されます。完全に一致するものが見つかった場合は、params の前に使用されます。

MSDN から:

オーバーロードの解決を実行する場合、パラメーター配列を持つメソッドは、通常の形式または拡張された形式のいずれかで適用できます (セクション 7.4.2.1)。メソッドの展開された形式は、メソッドの通常の形式が適用されず、展開された形式と同じシグネチャを持つメソッドが同じ型でまだ宣言されていない場合にのみ使用できます。

彼らの例:

using System;
class Test
{
   static void F(params object[] a) {
      Console.WriteLine("F(object[])");
   }
   static void F() {
      Console.WriteLine("F()");
   }
   static void F(object a0, object a1) {
      Console.WriteLine("F(object,object)");
   }
   static void Main() {
      F();
      F(1);
      F(1, 2);
      F(1, 2, 3);
      F(1, 2, 3, 4);
   }
}

出力:

F();
F(object[]);
F(object,object);
F(object[]);
F(object[]);
于 2010-01-30T13:47:13.677 に答える
5
public void AddScriptToPage(string href, string elementId) 

.. 呼び出されます。コンパイラは、params の優先度が最も低く、最も正確に一致する署名を選択します。

于 2010-01-30T13:45:44.647 に答える