2011-07-27 2 views
3

제 질문에 대한 대답은 this answer입니다.C#에서 확장 메서드를 호출하면 어떻게 해결됩니까?

public class A { } 

public static class ExtendedA 
{ 
    public static void Ext(this A a) { } 
} 

public static class ExtendedB 
{ 
    public static void Ext(this A a) { } 
} 

public static class App 
{ 
    public static void Main() 
    { 
     A a = new A(); 
     a.Ext(); 
    } 
} 

C# 컴파일러는 방법은 어떻게 전화를 선택 않습니다

그러나 또 다른 상황이?

+2

이 컴파일됩니까? – V4Vendetta

+0

@Jamiec : 예, 할 수 있습니다. 확장 메서드에 관한 질문은 정확히 작동하는 방식입니다. – Ian

+1

둘 사이에 호출이 모호하기 때문에 컴파일되지 않을 것이라고 생각합니다. – Ian

답변

3

같은 네임 스페이스의 모든 코드를 컴파일하려고하면 a.Ext()에 컴파일러 오류가 발생하여 Ext은 해결할 수없는 모호한 함수 호출입니다. 이 오류를 수정하려면 확장 클래스를 다른 네임 스페이스로 이동하고 그 중 하나만 가져 오거나 일반 정적 정적 메서드로 메서드를 호출해야합니다.

귀하의 질문에 직접 답변 : C# 컴파일러 을 선택하지 않았습니다. 그것은 당신을 강요합니다.

2

그것은하지 않습니다 - 전화가 완전히 모호한 경우, 당신은 컴파일러 오류 CS0121 수 :

오류 1 호 : 당신이 당신의 자신의 코드를하려고하면

The call is ambiguous between the following methods or properties: 'ExtendedA.Ext(A)' and 'ExtendedB.Ext(A)'

2

, 그것은 다음과 같은 오류를 제공을 'ConsoleApplication3.ExtendedA.Ext (ConsoleApplication3.A)'및 'ConsoleApplication3.ExtendedB.Ext (ConsoleApplication3.A)'c : \ temp \ trash \ ConsoleApplication3 \ ConsoleApplication3 \ Program.cs 다음 메서드 또는 속성 사이에 모호합니다. 콘솔 응용 프로그램 3

컴파일러는 오버로드를 위해했던 것처럼 올바른 호출을 해결하려고 시도했지만 결국 두 가지 방법으로 모호함이 생겨 결국 포기했습니다.

그래서 오버로드 된 메서드처럼 해결하려고 시도하는 것 같습니다.

1

동일한 서명으로 2 개의 확장 함수를 추가 할 수 없으므로 컴파일러는 어느 것을 사용할 지 구분할 수 없으므로 모호성 오류가 발생합니다.

관련 문제