如何在IL中实现显式接口实现?

时间:2010-07-19 13:21:13

标签: .net override cil explicit-interface

我一直在研究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规范中找到任何内容或谷歌。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

以下是您正在寻找的文档:
http://msdn.microsoft.com/en-us/library/ms173157.aspx

原因是处理这种情况:

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

如果你有两个方法具有你想要实现的相同签名,你需要一些东西来使它们不同,这样你就可以提供单独的实现。界面的名称提供了。