2011-09-21 2 views
1

일반 오버로딩이 허용되지 않는 이유가 궁금하고 "모호한"해결책의 컴파일러 오류가 발생합니다. 명시 적으로있는 것은 고려해야 할 인터페이스를 선언,일반 오버로드가 모호한 이유는 무엇입니까?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var p = new Program(); 

     p.DoWork(new First()); 
     p.DoWork(new Second()); 
     p.DoWork(new Multi()); //ambiguous: that's right! 

     p.Test<IFirst>(new First()); //ambiguous??? 
    } 


    private void DoWork(IFirst arg) { } 

    private void DoWork(ISecond arg) { } 

    private void Test<T>(T arg) where T : IFirst { } 

    private void Test<T>(T arg) where T : ISecond { } 
} 


interface IFirst { } 

interface ISecond { } 

class First : IFirst { } 

class Second : ISecond { } 

class Multi : IFirst, ISecond { } 

내가 명시 적 형태 (DoWork) 및 일반 하나의 차이를 느낄 수 없습니다입니다 : 여기

는 샘플 코드입니다. 첫 번째 이유는 허용되며 두 번째 것은 허용하지 않는 이유는 무엇입니까?

저의 목표는 똑같이 행동하는 두 가지 "테스트"방법을 사용하는 것입니다.하지만 정확하지는 않습니다.

모든 해결 방법 (다른 방식으로 이름을 지정하는 것 외에)?

미리 감사드립니다.

답변

6
+0

오케이. 이 기사에서는 제한 사항을 설명하지만 왜 해결할 수 없는지 이해하려고 노력하고 있습니다. 그러나 필자의 견해에 따르면 실제로 이상하게 보입니다. 컴파일러는 generic을 고려하기 위해 "시도한"경우에만 올바른 방법을 결정하는 데 문제가 없어야합니다. 해결할 수없는 문제보다 훨씬 더 많은 컴파일러 제한이 있습니다. 확실하지 않은 버그. –

+0

@Mario : 분명히 이것을 해결할 수있을 것입니다. 이런 식으로 구현하는 것은 디자인 결정이었습니다. –

0

이 코드는 메서드를 호출하지 않아도 컴파일되지 않습니다.

private void Test<T>(T arg) where T : IFirst { } 

private void Test<T>(T arg) where T : ISecond { } 

이 다음도 컴파일하지 않을 것이라고 같은 이유로 컴파일되지 않습니다 : 여기서 문제는 제네릭 형식 제약 방법 '서명의 일부가 아니기 때문에, 두 Test<T> 선언이 동일한 서명을 가지고있다 :

private void Foo() { } 

private void Foo() { } 

컴파일러는 같은 서명하는 방법이 이미 선언 된 것을 불평 할 것이다. DoWork 방법이 문제가없는 것으로

공지 사항 : 매개 변수 유형부터

private void DoWork(IFirst arg) { } 

private void DoWork(ISecond arg) { } 

는 메소드 서명의 부분, 우리가 무방 하나의 방법의 약 2 표준 과부하 이야기 .

관련 문제