문제

저는 IL의 명시적 인터페이스 구현을 살펴보았습니다.방법 Method 다음 클래스(인터페이스 IA 하나 있다 Method() 그 위에):

public class B : IA
    object IA.Method() {
        /* code */
    }
}

다음 IL 메서드 서명으로 컴파일됩니다.

.method private hidebysig newslot virtual final instance object IA.Method() cil managed {
    .override IA::Method
    /* code */
}

내 질문은 - 왜 IL에 메소드 이름이 있습니까? IA.Method(), 그냥 직선보다는 Method?이것이 실제로 무엇을 의미하며, 이를 놓치면 왜 작동하지 않습니까?ECMA 사양이나 Google에서 이에 대한 내용을 찾을 수 없습니다.

도움이 되었습니까?

해결책

이렇게 하면 메서드를 여러 번 가질 수 있기 때문입니다.

public class B : IA
{
    object Method() {    }
    object IA.Method() {    }
}

첫 번째는 일반적인 방법입니다.두 번째는 인터페이스 구현입니다.접두사가 없으면 둘을 구별할 수 없기 때문에 둘 다 가질 수 없습니다.

new B().Method(); // calls the normal method
((IA)new B()).Method(); // calls the IA interface method

다른 팁

찾고 있는 문서는 다음과 같습니다.
http://msdn.microsoft.com/en-us/library/ms173157.aspx

그 이유는 이 사건을 처리하기 위해서입니다.

public class C : IA, IB
{
    object IA.Method()
    { 
        // Implementation!
    } 
    object IB.Method()
    { 
        // Implementation!
    } 
}

구현하려는 동일한 시그니처를 가진 두 개의 메소드가 있는 경우 별도의 구현을 제공할 수 있도록 이들을 다르게 만드는 것이 필요합니다.인터페이스의 이름이 이를 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top