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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top