2010-07-19 69 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! 
    } 
} 

如果你有兩種方法具有相同你想要實現的簽名,你需要一些東西來讓它們不同,所以你可以提供獨立的實現。接口的名稱提供了。