2010-07-19 21 views
2

J'ai examiné les implémentations d'interface explicites dans IL. La méthode Method dans la classe suivante (interface IA a une seule Method() sur elle):Comment les implémentations d'interface explicites sont-elles implémentées dans IL?

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

est compilé à la signature de la méthode IL suivante:

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

Ma question est - pourquoi le nom de la méthode dans IL IA.Method(), plutôt que simplement droite Method? Qu'est-ce que cela signifie réellement, et pourquoi cela ne fonctionne-t-il pas si on l'oublie? Je ne trouve rien dans la spécification ECMA ou google à ce sujet.

Répondre

3

C'est parce que de cette façon vous pouvez avoir une méthode plusieurs fois.

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

La première est une méthode normale. La seconde est l'implémentation de l'interface. Sans le préfixe vous ne pourriez pas avoir les deux parce que vous ne pourriez pas les différencier.

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

Aaah, à droite. Je ne pouvais pas trouver dans la spécification où cette syntaxe/comportement est défini. – thecoop

2

est ici la documentation que vous cherchez:
http://msdn.microsoft.com/en-us/library/ms173157.aspx

La raison en est de traiter ce cas:

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

Si vous avez deux méthodes avec le même signature que vous souhaitez implémenter, vous avez besoin de quelque chose pour les différencier afin de pouvoir fournir des implémentations séparées. Le nom de l'interface fournit cela.