Compartilhar via


Resolver erros e avisos relacionados a membros que implementam uma interface

Este artigo aborda os seguintes avisos 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 ele 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 usar uma implementação de interface explícita.
  • CS0460: restrições para métodos de substituição e implementação de interface explícita são herdadas do método base, portanto, não podem ser especificadas diretamente, exceto por 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: a implementação explícita da interface 'nome do método' corresponde a mais de um membro da interface. Qual membro de interface é realmente escolhido depende da implementação. Em vez disso, considere usar 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 correspondente na interface.
  • CS0538: O membro em declaração de interface explícita não é uma interface.
  • CS0539: O membro na declaração de interface explícita não foi encontrado entre os membros da interface que podem ser implementados.
  • CS0540: O tipo contido 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: Membro adiciona um acessor que não existe no membro de interface.
  • CS0551: A implementação da interface explícita não tem um acessador.
  • CS0630: o membro não pode implementar o membro da interface porque ele tem um parâmetro __arglist.
  • CS0686: O acessador não pode implementar o membro da interface. Use uma implementação de interface explícita.
  • CS0736: o membro não implementa o membro da interface da instância. Ele não pode implementar o membro da interface porque ele é estático.
  • CS0737: o membro não implementa o membro da interface. Ele não pode implementar um membro da interface porque ele não é público.
  • CS0738: o membro não implementa o membro da interface. Ele não pode porque não tem o tipo de retorno correspondente.
  • CS8705: o membro da interface não tem uma implementação mais específica. Nenhum membro é mais específico.
  • CS8854: o membro não implementa o 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 e sintaxe da interface

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: Membro em 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 fornecer manualmente os acessadores de evento add e remove 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 por meio do tipo de interface, tornando a public palavra-chave redundante e não permitida nesse contexto.
  • Remova o abstract modificador de implementações de interface explícitas (CS0106). 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 struct que implementa a interface (CS0531). Antes do C# 8.0, os membros da interface não podem 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 os tipos de interface podem ser usados na sintaxe de implementação de interface explícita; 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 declara a interface em sua lista base (CS0541). Implementações de interface explícitas devem aparecer no corpo de uma classe ou tipo de 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 de Interface Explícita 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. Ele não pode porque não tem o tipo de retorno correspondente.
  • CS8854: O membro não implementa o membro correspondente 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 de interface precisamente porque a assinatura do método faz parte do contrato que determina qual membro da interface está sendo implementado.
  • Verifique se os tipos de parâmetro no método de implementação correspondem exatamente aos tipos de parâmetro 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 corresponder implementações a membros da interface.
  • Adicione um init acessador à propriedade de implementação quando a propriedade de interface declarar um init setter (CS8854). A init palavra-chave permite a inicialização da propriedade durante a construção do objeto, impedindo a modificação posteriormente, e a propriedade de implementação deve fornecer esse mesmo comportamento somente inicialização para atender ao contrato de interface.

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

Implementações ausentes ou incompletas

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

  • CS0535: O membro não implementa o membro correspondente da interface.
  • CS0550: o membro adiciona um acessador não encontrado no membro da interface.
  • CS0551: A implementação da interface explícita não tem um acessador.

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 atender aos requisitos de interface.
  • Remova todos os acessadores da propriedade de implementação que não são declarados na propriedade de interface (CS0550). A propriedade de implementação só pode incluir os acessadores declarados explicitamente na definição da 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 da 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 atender ao contrato completo do acessador definido pela interface.

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

Associação e resolução de elementos

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 contido não implementa o membro da interface.

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

  • Verifique se o nome do membro e a assinatura na implementação da interface explícita 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âmetros exatamente correspondentes, pois a implementação de interface explícita requer correspondência precisa ao contrato da interface.
  • Adicione a interface à lista de base da classe ou do 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 fornecer implementações explícitas.

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

Restrições de tipo genérico

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 usar uma implementação de interface explícita.
  • CS0460: restrições para métodos de substituição e implementação de interface explícita são herdadas do método base, portanto, não podem ser especificadas diretamente, exceto por 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âmetro de tipo na implementação devem corresponder às definidas na interface ou no método base.
  • Remova declarações de restrição explícitas de métodos de substituição e implementação de interface explícita (CS0460). O método de substituição herda suas restrições automaticamente do método base ou da interface, portanto, redeclará-las é redundante e não é permitida, exceto para casos específicos permitidos no C# 8 e posterior.
  • Aplique a default restrição para resolver ambiguidades com tipos de referência anuláveis em implementações de interface explícitas e de substituição ao usar c# 9 ou posterior (CS0460). Essa exceção à regra de herança de restrição permite especificar explicitamente a restrição padrão para desambiguar contextos de anotações anuláveis.
  • Especifique restrições explicitamente em métodos de substituição e implementação de interface explícita ao usar C# 8 ou posterior para habilitar anotações de tipos de referências nulas (CS0460). Essas restrições específicas são permitidas para dar suporte à análise de tipos de referência anuláveis em parâmetros de tipo 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 ou modificadores incorretos:

  • CS0736: o membro não implementa o membro da interface da instância. Ele não pode implementar o membro da interface porque ele é estático.
  • CS0737: o membro não implementa o 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 são 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 por meio da referência de interface.

Para obter mais informações, consulte Interfaces e Modificadores de Acesso.

Implementação e conflitos do acessador

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

  • CS0277: o membro não implementa o membro da interface porque ele 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 acessador 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 todos os modificadores de acesso de acessadores de propriedade que restrinjam a visibilidade a menos visível que public, ou adicione o modificador public se ele estiver ausente (CS0277). Todos os membros da interface são implicitamente public, portanto, o acessador implementador também deve ter acessibilidade pública para atender ao contrato de interface e ser acessível através do tipo de interface.
  • Substitua métodos por nomes semelhantes a acessadores (como get_PropertyName) por sintaxe de propriedade adequada usando a implementação de interface explícita (CS0470). O compilador gera métodos acessadores internamente para propriedades e a tentativa de criar manualmente métodos com esses nomes reservados entra em conflito com o mecanismo de implementação de propriedade.
  • Use a sintaxe de implementação de interface explícita para resolver conflitos de nomenclatura quando a interface contiver nomes de método que correspondem aos métodos de acessador gerados automaticamente (CS0686). O compilador gera automaticamente métodos como get_Property e set_Property para propriedades, e add_Eventremove_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 o acessador gerado pelo compilador.

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

Implementações ambíguas e conflitantes

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

  • CS0473: a implementação explícita da interface 'nome do método' corresponde a mais de um membro da interface. Qual membro de interface é realmente escolhido depende da implementação. Em vez disso, considere usar uma implementação não explícita.
  • CS8705: o membro da interface 'member' 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 da 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 de um método não genérico (como ao implementar ITest<int> onde ambos TestMethod(int) e TestMethod(T) se tornam idênticos), o sistema de metadados de infraestrutura de linguagem comum não pode determinar de forma inequívoca qual membro da interface associa a qual slot de implementação, portanto, usar a implementação implícita permite que o método único atenda aos dois requisitos de interface.
  • Forneça uma implementação explícita na classe ou struct de implementação que resolve a ambiguidade entre várias implementações padrão (CS8705). Esse erro normalmente ocorre com padrões de herança de diamante em que 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.
  • Reestruturar a hierarquia de interface para evitar conflitos de herança de diamante em que várias interfaces fornecem implementações padrão para o mesmo membro (CS8705). Ao redesenhar as relações de interface ou consolidar as implementações padrão em uma única interface, você pode eliminar a ambiguidade que impede que o compilador determine a implementação mais específica.

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

Restrições especiais de implementação

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

  • CS0630: o membro não pode implementar o 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, pois os contratos de interface exigem assinaturas previsíveis e de tipo seguro que podem ser verificadas em tempo de compilação.
  • Substitua o __arglist parâmetro por um parâmetro de params matriz para listas de argumentos de comprimento variável (CS0630). Ao contrário de __arglist, a palavra-chave params fornece um mecanismo de segurança de tipo para aceitar número variável de argumentos totalmente compatível com a implementação da interface e mantém a segurança de tipo no tempo de compilação que as interfaces exigem.

Para obter mais informações, consulte a palavra-chave Interfaces e params.