Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C#: Method signatures?

Let's say I create these two methods:

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

Which one of these methods gets call by the code below, and why?

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

How does the compiler determine which method to call?

like image 640
JamesBrownIsDead Avatar asked Jan 30 '10 13:01

JamesBrownIsDead


2 Answers

Your second method gets called, if an exact match is found, it's used before params.

From MSDN:

When performing overload resolution, a method with a parameter array may be applicable either in its normal form or in its expanded form (Section 7.4.2.1). The expanded form of a method is available only if the normal form of the method is not applicable and only if a method with the same signature as the expanded form is not already declared in the same type.

Their example:

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

Output:

F();
F(object[]);
F(object,object);
F(object[]);
F(object[]);
like image 76
Nick Craver Avatar answered Oct 23 '22 16:10

Nick Craver


public void AddScriptToPage(string href, string elementId) 

.. will get called. The compiler chooses the signature with the most accurate match, with params having least priority.

like image 26
cwap Avatar answered Oct 23 '22 16:10

cwap