2011-05-16 5 views
2

가능한 중복은 :
C# 4: conflicting overloaded methods with optional parametersC 번호 과부하 방법 동작

난 그냥 하나 개의 작은 연구 만든 다음 코드가 있습니다.

namespace Test { 
class Program 
{ 
    public interface ITestA 
    { 
     void MethodA(int a, int b); 
    } 

    public class TestAClass : ITestA 
    { 
     public void MethodA(int a, int b) 
     { 
      Console.WriteLine("MethodA with param"); 
     } 

     public void MethodA(int a, int b, bool logic = true) 
     { 
      Console.WriteLine("MethodA logic with param"); 
     } 
    } 

    public interface ITestB 
    { 
     void MethodA(int a, int b, bool logic = true); 
    } 

    public class TestBClass : ITestB 
    { 
     public void MethodA(int a, int b) 
     { 
      Console.WriteLine("MethodB with param"); 
     }   

     public void MethodA(int a, int b, bool logic = true) 
     { 
      Console.WriteLine("MethodB logic with param"); 
     } 
    } 

    static void Main(string[] args) 
    { 
     var testA = new TestAClass(); 
     testA.MethodA(1, 1);    
     var testB = new TestBClass(); 
     testB.MethodA(1, 1); 
    } 
} } 

나는 컴파일러는 항상 2 개 매개 변수와 함께 짧은 방법을 선택하는 이유 질문이 있습니다. 물론이 모든 작업은 인터페이스없이 동일한 방식으로 수행됩니다.

감사

+3

인터페이스가 있거나없는 경우와 같은 방식으로 작동하는 경우 질문에 인터페이스를 표시하는 이유는 무엇입니까? 아이디어는 동작을 재현하는 데 필요한 * 최소량의 코드를 사용하는 것입니다. 따라서 우리는 관련없는 세부 사항보다는 실제 질문에 집중할 수 있습니다. –

+2

또한, 이것은 가장 확실하게 ** 연산자가 오버로드되지 않고, 오히려 * 메서드 * 오버로딩, 완전히 다른 것입니다. –

+2

그리고 주요 문제는 인터페이스가 아닌 선택적 매개 변수 때문입니다. – Rik

답변

2

이 아래로 비등하는 방법 컴파일러 라는 이름의 취급 및 선택적 매개 변수.
자세한 내용은 이라는 문단에 대한 자세한 내용은 this article at MSDN을 확인하십시오. 두 후보가 똑같이 좋은 것으로 판단하는 경우

, 선호 인수는 호출에서 생략 된 대한 선택적 매개 변수이없는 후보로 이동합니다. 이것은 매개 변수가 적은 응시자에 대한 과부하 해결의 일반적인 선호 결과입니다.

이 경우, 컴파일러가 선택적 매개 변수없이 메소드를 선택하는 이유가 여기에 있습니다.

1

를 컴파일러가 메소드를 호출에 완벽하게 대응하고를 사용하는 방법을 발견하기 때문에. 다른 적절한 방법에 대한
컴파일러 검색 첫 번째 방법이 실패하면 ...