2010-01-30 16 views
5

Digamos que crear estos dos métodos:C#: ¿Firmas de métodos?

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

¿Cuál de estos métodos obtiene llamado por el código de abajo, y por qué?

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

¿Cómo determina el compilador qué método llamar?

Respuesta

8

Se llama al segundo método, si se encuentra una coincidencia exacta, se usa antes de los parámetros.

From MSDN:

Al realizar la resolución de sobrecarga, un método con una matriz de parámetros puede ser aplicable, ya sea en su forma normal o en su forma expandida (sección 7.4.2.1). La forma expandida de un método está disponible solo si la forma normal del método no es aplicable y solo si un método con la misma firma que el formulario expandido aún no está declarado en el mismo tipo.

Su ejemplo:

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

Salida:

F(); 
F(object[]); 
F(object,object); 
F(object[]); 
F(object[]); 
+0

Esto es particularmente confuso para la gente cuando llaman F (nulo). ¿Obtiene F ((objeto []) nulo) o F (objeto nuevo [] {nulo})? Muchas personas esperan lo último, pero dado que el primero es aplicable en la forma normal, es mejor. –

+0

@Eric - Nunca dejas de sorprenderme con una profunda pregunta/hecho marco en el que nunca pensé ... pero terminé usándolo en la práctica meses después. Algunas de sus respuestas aquí han hecho enormes diferencias de rendimiento para mí, sigan así. –

+0

En la línea de su comentario, si no ha leído la especificación anotada publicada por Microsoft, realmente debería; es una mina de oro – jason

5
public void AddScriptToPage(string href, string elementId) 

.. se llamará. El compilador elige la firma con la coincidencia más precisa, y los params tienen menos prioridad.

Cuestiones relacionadas