Como as implementações de interface explícitas são implementadas em IL?
-
17-09-2020 - |
Pergunta
Tenho observado implementações explícitas de interface em IL.O método Method
na seguinte classe (interface IA
tem um único Method()
nele):
public class B : IA
object IA.Method() {
/* code */
}
}
é compilado para a seguinte assinatura de método IL:
.method private hidebysig newslot virtual final instance object IA.Method() cil managed {
.override IA::Method
/* code */
}
Minha pergunta é: por que o nome do método está em IL IA.Method()
, em vez de apenas direto Method
?O que isso realmente significa e por que não funciona se for perdido?Não consigo encontrar nada nas especificações da ECMA ou no Google sobre isso.
Solução
Isso ocorre porque dessa forma você pode ter um método várias vezes.
public class B : IA
{
object Method() { }
object IA.Method() { }
}
O primeiro é um método normal.A segunda é a implementação da interface.Sem o prefixo você não poderia ter ambos porque não poderia diferenciá-los.
new B().Method(); // calls the normal method
((IA)new B()).Method(); // calls the IA interface method
Outras dicas
Aqui está a documentação que você está procurando:
http://msdn.microsoft.com/en-us/library/ms173157.aspx
A razão para isso é lidar com este caso:
public class C : IA, IB
{
object IA.Method()
{
// Implementation!
}
object IB.Method()
{
// Implementation!
}
}
Se você possui dois métodos com a mesma assinatura que deseja implementar, precisa de algo para diferenciá-los, para poder fornecer implementações separadas.O nome da interface fornece isso.