2010-07-19 50 views
2

我一直在看IL中的显式接口实现。在下面的类的方法Method(接口IA上有单Method()):在IL中如何实现显式接口实现?

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规范或谷歌搜索中找不到任何内容。

回答

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 
+0

啊,对。我无法在规范中找到此语法/行为的定义。 – thecoop 2010-07-19 13:36:07

2

这里就是你要找的文件:
http://msdn.microsoft.com/en-us/library/ms173157.aspx

它的原因是为了处理这种情况:

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

如果你有两种方法具有相同你想要实现的签名,你需要一些东西来让它们不同,所以你可以提供独立的实现。接口的名称提供了。