2

我一直在查看 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 规范或谷歌中找不到任何关于它的内容。

4

2 回答 2

3

这是因为这样你可以多次使用一个方法。

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
于 2010-07-19T13:32:07.740 回答
2

这是您要查找的文档:http:
//msdn.microsoft.com/en-us/library/ms173157.aspx

处理这个案子的原因是:

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

如果您有两个具有相同签名的方法要实现,那么您需要一些东西来使它们不同,以便您可以提供单独的实现。接口的名称提供了这一点。

于 2010-07-19T13:35:56.670 回答