2010-01-30 4 views
5

이 두 메소드를 생성한다고 가정 해 보겠습니다.C# : 메서드 서명?

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

아래 코드로 호출되는 메소드는 무엇입니까? 그 이유는 무엇입니까?

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

컴파일러는 호출 할 메소드를 어떻게 결정합니까?

답변

8

두 번째 메소드가 호출되면 정확히 일치하는 항목이 발견되면 params 앞에 사용됩니다.

From 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(); 
F(object[]); 
F(object,object); 
F(object[]); 
F(object[]); 
+0

이 사람들에게 특히 혼란 스럽다. F ((object []) null) 또는 F (new object [] (null))를 얻나요? 많은 사람들이 후자를 기대하지만, 전자가 정상적인 형태로 적용 가능하기 때문에 더 좋습니다. –

+0

@ 에릭 - 절대로 깊이 생각할 수없는 프레임 워크 질문/사실로 나를 놀라게하는 일은 결코 없을 것입니다. 그러나 실제로 몇 달 후 사용하게됩니다. 당신의 대답 중 일부는 저를 위해 엄청난 성능 차이를 만들어 냈습니다. –

+0

주석 라인에 따라 Microsoft에서 게시 한 주석이 달린 사양을 읽지 않은 경우에는 꼭해야합니다. 그것은 금광입니다. – jason

5
public void AddScriptToPage(string href, string elementId) 

이 호출됩니다. 컴파일러는 가장 정확한 우선 순위를 가진 매개 변수를 사용하여 가장 정확한 일치 항목을 선택합니다.