Partilhar via


Resolver erros e avisos relacionados a membros que implementam uma interface

Este artigo aborda os seguintes erros do compilador:

  • CS0071: Uma implementação de interface explícita de um evento deve usar a sintaxe do acessador de eventos.
  • CS0106: O modificador não é válido para este item.
  • CS0277: O membro não implementa o membro da interface porque não é público.
  • CS0425: As restrições para o parâmetro de tipo do método devem corresponder às restrições para o parâmetro de tipo do método de interface. Em vez disso, considere o uso de uma implementação de interface explícita.
  • CS0460: As restrições para substituir e métodos de implementação de interface explícita são herdadas do método base, portanto, não podem ser especificadas diretamente, exceto para uma restrição 'class' ou 'struct'.
  • CS0470: O método não pode implementar o acessador de interface para o tipo. Use uma implementação de interface explícita.
  • CS0473: O 'nome do método' da implementação explícita da interface corresponde a mais de um membro da interface. O membro da interface realmente escolhido depende da implementação. Em vez disso, considere o uso de uma implementação não explícita.
  • CS0531: Os membros da interface não podem ter uma definição.
  • CS0535: O membro não implementa o membro da interface.
  • CS0538: Membro em declaração de interface explícita não é uma interface.
  • CS0539: Membro na declaração de interface explícita não é encontrado entre os membros da interface que podem ser implementados.
  • CS0540: O tipo que contém não implementa o membro da interface.
  • CS0541: A declaração de interface explícita só pode ser declarada em uma classe, registro, struct ou interface.
  • CS0550: O membro adiciona um acessor que não existe no membro da interface.
  • CS0551: Implementação de interface explícita está a faltar um método de acesso.
  • CS0630: Membro não pode implementar membro da interface porque ele tem um parâmetro __arglist.
  • CS0686: O Accessor não pode implementar o membro da interface. Use uma implementação de interface explícita.
  • CS0736: Membro não implementa membro da interface de instância. Ele não pode implementar o membro da interface porque ele é estático.
  • CS0737: Membro não implementa membro da interface. Ele não pode implementar um membro da interface porque ele não é público.
  • CS0738: Membro não implementa membro da interface. Não pode porque não tem o tipo de retorno correspondente.
  • CS8705: Membro da interface não tem uma implementação mais específica. Nenhum dos membros é mais específico.
  • CS8854: Membro não implementa membro da interface.
  • CS9333: O tipo de parâmetro deve corresponder ao membro implementado.
  • CS9334: O tipo de retorno deve corresponder ao membro implementado.

Declaração de interface e sintaxe

Os seguintes erros estão relacionados à sintaxe e estrutura adequadas ao declarar implementações de interface explícitas:

  • CS0071: Uma implementação de interface explícita de um evento deve usar a sintaxe do acessador de eventos.
  • CS0106: O modificador não é válido para este item.
  • CS0531: Os membros da interface não podem ter uma definição.
  • CS0538: O membro na declaração de interface explícita não é uma interface.
  • CS0541: A declaração de interface explícita só pode ser declarada em uma classe, registro, struct ou interface.

Você pode corrigir esses erros usando as seguintes técnicas:

  • Você deve prover manualmente add e remove accessores de eventos ao implementar explicitamente um evento de interface (CS0071). O compilador não gera automaticamente esses acessadores para implementações de interface explícitas, portanto, você deve defini-los explicitamente para especificar como o evento é armazenado e gerenciado.
  • Remova o public modificador de implementações de interface explícitas (CS0106). Implementações de interface explícitas são implicitamente públicas quando acessadas através do tipo de interface, tornando a public palavra-chave redundante e não permitida neste contexto.
  • Remova o abstract modificador de implementações de interface explícitas (CS0106). As implementações de interface explícitas fornecem a implementação real e não podem ser marcadas como abstratas porque não podem ser substituídas em classes derivadas.
  • Remova o corpo do método das declarações de membro da interface ou mova a implementação para uma classe ou estrutura que implemente a interface (CS0531). Antes do C# 8.0, os membros da interface não podiam conter implementações; a partir do C# 8.0, você pode fornecer métodos de interface padrão usando sintaxe específica.
  • Verifique se o tipo especificado na declaração de interface explícita é um tipo de interface real (CS0538). Somente tipos de interface podem ser usados na sintaxe explícita de implementação de interface; Tentar usar uma classe ou outro tipo que não seja de interface viola as regras de implementação explícitas.
  • Mova declarações de interface explícitas para uma classe ou struct que declare a interface em sua lista base (CS0541). As implementações de interface explícitas devem aparecer no corpo de uma classe ou tipo struct e não podem ser declaradas no nível do namespace ou em outros contextos.

Para obter mais informações, consulte Interfaces, implementação explícita de interface e Como implementar eventos de interface.

Tipos de retorno e assinaturas

Os seguintes erros ocorrem quando a assinatura do método de implementação não corresponde à declaração de membro da interface:

  • CS0738: O membro não implementa o membro da interface. Não pode fazê-lo porque não tem o tipo de retorno adequado.
  • CS8854: Membro não implementa membro da interface.
  • CS9333: O tipo de parâmetro deve corresponder ao membro implementado.
  • CS9334: O tipo de retorno deve corresponder ao membro implementado.

Você pode corrigir esses erros usando as seguintes técnicas:

  • Altere o tipo de retorno do método de implementação para corresponder exatamente ao tipo de retorno declarado no membro da interface (CS0738, CS9334). A assinatura da implementação deve corresponder à declaração da interface precisamente porque a assinatura do método faz parte do contrato que determina qual membro da interface está sendo implementado.
  • Certifique-se de que os tipos de parâmetros no método de implementação correspondam exatamente aos tipos de parâmetros declarados no membro da interface (CS9333). Cada parâmetro deve ter o tipo idêntico na mesma posição especificada na declaração de interface, pois os tipos de parâmetro são componentes fundamentais da assinatura do método que o compilador usa para fazer corresponder implementações aos membros da interface.
  • Adicione um init acessador à propriedade de implementação quando a propriedade da interface declarar um init setter (CS8854). A init palavra-chave permite a inicialização da propriedade durante a construção do objeto, evitando a modificação posterior, e a propriedade de implementação deve fornecer esse mesmo comportamento somente de inicialização para satisfazer o contrato de interface.

Para obter mais informações, consulte Interfaces, Propriedades e Definidores apenas de inicialização.

Implementações ausentes ou incompletas

Os seguintes erros ocorrem quando uma classe não consegue implementar totalmente uma interface ou implementa membros que não correspondem ao contrato de interface:

  • CS0535: O membro não implementa um membro da interface.
  • CS0550: Membro adiciona um acessador não encontrado no membro da interface.
  • CS0551: A implementação de interface explícita está a faltar um método de acesso.

Você pode corrigir esses erros usando as seguintes técnicas:

  • Forneça uma implementação para cada membro declarado na interface ou declare o tipo como abstract (CS0535). Cada membro deve ser implementado para satisfazer os requisitos da interface.
  • Remova todos os acessadores da propriedade de implementação que não estão declarados na propriedade da interface (CS0550). A propriedade de implementação só pode incluir os acessadores explicitamente declarados na definição de interface, garantindo que a implementação não adicione funcionalidade além do que o contrato de interface especifica.
  • Adicione todos os acessadores necessários à implementação de interface explícita para corresponder à declaração de interface (CS0551). Cada acessador declarado na interface deve ter um acessador correspondente na implementação com assinaturas correspondentes, pois a implementação deve cumprir o contrato completo de acessador definido pela interface.

Para obter mais informações, consulte Interfaces e propriedades.

Correspondência e resolução de membros

Os seguintes erros ocorrem ao tentar implementar membros da interface que não existem na interface ou quando o tipo que contém não declara a interface:

  • CS0539: Membro na declaração de interface explícita não é encontrado entre os membros da interface que podem ser implementados.
  • CS0540: Tipo que contém não implementa membro da interface.

Você pode corrigir esses erros usando as seguintes técnicas:

  • Verifique se o nome e a assinatura do membro na implementação explícita da interface correspondem exatamente a um membro declarado na interface ou remova a implementação incorreta (CS0539). O membro que você está tentando implementar deve realmente existir na definição de interface com nome, tipo de retorno e tipos de parâmetro correspondentes, pois a implementação de interface explícita requer correspondência precisa com o contrato de interface.
  • Adicione a interface à lista base da classe ou da struct, ou remova a implementação explícita da interface (CS0540). Um tipo só pode implementar explicitamente membros de interfaces que ele declara em sua lista de herança, portanto, o tipo de implementação deve estabelecer a relação de interface antes de poder fornecer implementações explícitas.

Para obter mais informações, consulte Interfaces e implementação de interface explícita.

Restrições de tipo genéricas

Os seguintes erros ocorrem ao implementar métodos de interface genéricos com restrições de parâmetro de tipo:

  • CS0425: As restrições para o parâmetro de tipo do método devem corresponder às restrições para o parâmetro de tipo do método de interface. Em vez disso, considere o uso de uma implementação de interface explícita.
  • CS0460: As restrições para métodos de substituição e implementação explícita de interface são herdadas do método base, portanto, não podem ser especificadas diretamente, exceto quando se trata de uma restrição 'class' ou 'struct'.

Você pode corrigir esses erros usando as seguintes técnicas:

  • Verifique se a where cláusula no método de implementação é idêntica à declaração do método de interface ou corresponde ao significado semântico das restrições (CS0425). As restrições de parâmetros de tipo na implementação devem corresponder às definidas na interface ou no método base.
  • Remova as declarações de restrição explícitas dos métodos de substituição e de implementação de interface explícita (CS0460). O método de substituição herda suas restrições automaticamente do método base ou de interface, portanto, redefini-las é redundante e não é permitido, exceto em casos específicos permitidos em C# 8 e posteriores.
  • Aplique a default restrição para resolver ambiguidades com tipos de referência anuláveis em implementações de substituição e de interface explícitas ao usar C# 9 ou posterior (CS0460). Esta exceção à regra de herança de restrição permite especificar de forma explícita a restrição padrão para resolver ambiguidades nos contextos de anotações nulas.
  • Especifique explicitamente restrições where T : class ou where T : struct em métodos de sobreposição e de implementação explícita de interface ao usar C# 8 ou posterior para habilitar anotações de tipo de referência anuláveis (CS0460). Essas restrições específicas são permitidas para dar suporte à análise de tipo de referência anulável em parâmetros de tipo que são restritos a tipos de referência ou valor.

Para obter mais informações, consulte Restrições em parâmetros de tipo, interfaces e tipos de referência anuláveis.

Visibilidade e modificadores do método

Os seguintes erros ocorrem ao implementar métodos de interface com acessibilidade incorreta ou modificadores:

  • CS0736: Membro não implementa membro da interface de instância. Ele não pode implementar o membro da interface porque ele é estático.
  • CS0737: Membro não implementa membro da interface. Ele não pode implementar um membro da interface porque ele não é público.

Você pode corrigir esses erros usando as seguintes técnicas:

  • Remova o static modificador da declaração de método que implementa o membro da interface (CS0736). Antes do C# 10, os membros da interface eram membros da instância, não membros estáticos.
  • Adicione o public modificador de acesso ao método que implementa o membro da interface (CS0737). Todos os membros da interface são implicitamente public porque as interfaces definem um contrato para o comportamento público, portanto, o método de implementação também deve ter acessibilidade pública para ser acessível através da referência da interface.

Para obter mais informações, consulte Interfaces e modificadores de acesso.

Implementação do método de acesso e conflitos

Os seguintes erros ocorrem ao implementar propriedades de interface ou eventos com métodos de acesso que têm problemas de visibilidade ou conflitos de nomenclatura:

  • CS0277: Membro não implementa membro da interface porque não é público.
  • CS0470: O método não pode implementar o acessador de interface para o tipo. Use uma implementação de interface explícita.
  • CS0686: O Accessor não pode implementar o membro da interface. Use uma implementação de interface explícita.

Você pode corrigir esses erros usando as seguintes técnicas:

  • Remova quaisquer modificadores de acesso dos acessores de propriedade que restrinjam a visibilidade para menos visível que public, ou adicione o modificador public se este estiver ausente (CS0277). Todos os membros da interface são implicitamente public, de modo que o acessador de implementação também deve ter acessibilidade pública para satisfazer o contrato de interface e ser acessível através do tipo de interface.
  • Substitua métodos por nomes semelhantes a acessadores (como get_PropertyName) com sintaxe de propriedade adequada usando implementação de interface explícita (CS0470). O compilador gera métodos de acessador internamente para propriedades, e tentar criar manualmente métodos com esses nomes reservados entra em conflito com o mecanismo de implementação de propriedade.
  • Use a sintaxe explícita de implementação da interface para resolver conflitos de nomenclatura quando a interface contém nomes de método que correspondem aos métodos de acesso gerados automaticamente (CS0686). O compilador gera automaticamente métodos como get_Property e set_Property para propriedades e add_Event e remove_Event para eventos, portanto, se uma interface declara métodos com esses nomes exatos, a implementação explícita é necessária para desambiguar entre o método de interface e os acessadores gerados pelo compilador.

Para obter mais informações, consulte Interfaces, propriedades e eventos.

Implementações ambíguas e conflituosas

Os seguintes erros ocorrem quando o compilador não pode determinar qual implementação de interface usar:

  • CS0473: O 'nome do método' da implementação explícita da interface corresponde a mais de um membro da interface. O membro da interface realmente escolhido depende da implementação. Em vez disso, considere o uso de uma implementação não explícita.
  • CS8705: Membro da interface 'membro' não tem uma implementação mais específica. Nenhum dos dois é mais específico.

Você pode corrigir esses erros usando as seguintes técnicas:

  • Elimine a implementação de interface explícita e, em vez disso, use uma única implementação pública implícita para ambos os métodos de interface (CS0473). Quando um método genérico adquire a mesma assinatura que um método não genérico (como ao implementar ITest<int> onde ambos TestMethod(int) e TestMethod(T) tornam idênticos), o sistema de metadados da infraestrutura de linguagem comum não consegue determinar inequivocamente qual membro da interface se liga a qual slot de implementação, então, a utilização da implementação implícita permite que o método único cumpra ambos os requisitos da interface.
  • Forneça uma implementação explícita na classe ou struct de implementação que resolva a ambiguidade entre várias implementações padrão (CS8705). Este erro normalmente ocorre com padrões de herança de diamante onde uma classe implementa várias interfaces que fornecem implementações padrão para o mesmo membro. O compilador precisa que você especifique explicitamente qual implementação usar, ou forneça sua própria implementação.
  • Reestruture a hierarquia de interface para evitar conflitos de herança de diamantes em que várias interfaces fornecem implementações padrão para o mesmo membro (CS8705). Redesenhando as relações de interface ou consolidando as implementações padrão em uma única interface, você pode eliminar a ambiguidade que impede o compilador de determinar a implementação mais específica.

Para obter mais informações, consulte Interfaces e métodos de interface padrão.

Restrições especiais de aplicação

O seguinte erro ocorre ao usar tipos de parâmetros especiais que não são compatíveis com a implementação da interface:

  • CS0630: Membro não pode implementar membro da interface porque ele tem um parâmetro __arglist.

Você pode corrigir esse erro usando as seguintes técnicas:

  • Remova o __arglist parâmetro do método de implementação (CS0630). A __arglist palavra-chave permite que os métodos aceitem números variáveis de argumentos de forma não gerenciada, mas esse recurso é incompatível com a implementação da interface porque os contratos de interface exigem assinaturas previsíveis e seguras para o tipo que podem ser verificadas em tempo de compilação.
  • Substitua o __arglist parâmetro por um params parâmetro array para listas de argumentos de comprimento variável (CS0630). Ao contrário de __arglist, a palavra-chave params fornece um mecanismo seguro para aceitar quantidades variáveis de argumentos que é totalmente compatível com a implementação de interfaces e mantém a segurança de tipos exigida no tempo de compilação.

Para obter mais informações, consulte Interfaces e keyword params.