Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O compilador gera os seguintes erros para declarações inválidas de membros estáticos abstratos ou virtuais em interfaces:
- CS8920: A interface não pode ser usada como argumento de tipo. O membro estático não tem uma implementação mais específica na interface.
- CS8921: o parâmetro de um operador unário deve ser o tipo que contém ou seu parâmetro de tipo restrito a ele.
-
CS8922: O tipo de parâmetro para o operador
++ou--deve ser o tipo que o contém, ou um parâmetro de tipo restrito a ele. -
CS8923: O tipo de retorno para o operador
++ou--deve corresponder ao tipo de parâmetro, ser derivado do tipo de parâmetro ou ser um parâmetro de tipo do tipo que o contém, restrito a ele, a menos que o tipo de parâmetro seja um parâmetro de tipo diferente. - CS8924: um dos parâmetros de um operador binário deve ser o tipo de contenção ou seu parâmetro de tipo restrito a ele.
- CS8925: O primeiro operando de um operador de deslocamento sobrecarregado deve ter o mesmo tipo que o tipo que o contém ou ter seu parâmetro de tipo constrangido a ele
- CS8926: um membro de interface estático virtual ou abstrato só pode ser acessado em um parâmetro de tipo.
- CS8928: o tipo não implementa o membro da interface estática. O método não pode implementar o membro da interface porque ele não é estático.
- CS8930: A implementação explícita de um operador definido pelo usuário deve ser declarada estática
- CS8931: A conversão definida pelo usuário em uma interface deve converter para ou de um parâmetro de tipo no tipo adjacente que é restrito ao tipo adjacente
- CS8932: o método 'UnmanagedCallersOnly' não pode implementar o membro da interface no tipo
- CS9044: o tipo não implementa o membro da interface. O método não pode implementar implicitamente um membro inacessível.
- CS9046: Um dos parâmetros de um operador de igualdade ou desigualdade declarado em uma interface deve ser um parâmetro de tipo restrito à interface
Esses erros ocorrem em três locais em seu código:
- Quando você declara uma interface com membros estáticos abstratos ou virtuais,
- Quando você declara um tipo que implementa uma interface com membros estáticos abstratos ou virtuais, e
- Quando você acessa um método estático abstrato ou virtual declarado em uma interface.
Erros na declaração de interface
Você pode encontrar os seguintes erros ao declarar uma interface com membros entre static abstract e static virtual:
- CS8921: o parâmetro de um operador unário deve ser o tipo que contém ou seu parâmetro de tipo restrito a ele.
-
CS8922: O tipo de parâmetro para o operador
++ou--deve ser o tipo que o contém ou um parâmetro de tipo restrito a ele. -
CS8923: O tipo de retorno para o operador
++ou--deve corresponder ao tipo de parâmetro, ser derivado do tipo de parâmetro ou ser um parâmetro de tipo do tipo que o contém, restrito a ele, a menos que o tipo de parâmetro seja um parâmetro de tipo diferente. - CS8924: um dos parâmetros de um operador binário deve ser o tipo de contenção ou seu parâmetro de tipo restrito a ele.
- CS8925: O primeiro operando de um operador de deslocamento sobrecarregado deve ter o mesmo tipo que o tipo que o contém ou um parâmetro de tipo restrito a ele
- CS8931: A conversão personalizada em uma interface deve converter para ou a partir de um parâmetro de tipo no tipo delimitante restrito ao tipo delimitador
- CS9046: Um dos parâmetros de um operador de igualdade ou desigualdade declarado na interface deve ser um parâmetro de tipo restrito à interface
Para operadores unários declarados em uma interface, verifique se o parâmetro é o próprio tipo de interface ou um tipo parâmetro T onde T é restringido a implementar a interface (CS8921). Essa restrição garante que o operador só possa ser aplicado a tipos que implementam a interface, permitindo que o compilador resolva a implementação correta em tempo de compilação.
Para operadores de incremento (++) e decremento (--), verifique se o parâmetro segue as mesmas regras que outros operadores unários (CS8922). Além disso, o tipo de retorno deve corresponder ao tipo de parâmetro, derivar dele ou ser o parâmetro de tipo da interface restrito à interface (CS8923). Essas regras garantem que as operações de incremento e decremento retornem um tipo compatível que pode ser atribuído de volta à variável original.
Para operadores binários, pelo menos um dos dois parâmetros deve ser o tipo de interface que contém ou um parâmetro de tipo restrito para implementar a interface (CS8924). Esse requisito permite que o outro parâmetro seja qualquer tipo, habilitando operadores como T operator +(T left, int right) em cenários matemáticos genéricos.
Para operadores de deslocamento (<< e >>), o primeiro operando deve ser o tipo que o contém ou seu parâmetro de tipo restrito (CS8925). O segundo operando segue as regras do operador de deslocamento padrão e normalmente é int.
Para operadores de conversão definidos pelo usuário, a conversão deve envolver um parâmetro de tipo restrito ao tipo de interface delimitador (CS8931). Você não pode definir conversões entre tipos arbitrários em uma interface; a conversão deve estar relacionada aos tipos que implementam a interface.
Para operadores de igualdade (==) e desigualdade (!=), pelo menos um parâmetro deve ser um parâmetro de tipo restrito à interface, não apenas o tipo de interface em si (CS9046). Esse requisito mais rigoroso para operadores de igualdade garante a segurança de tipo adequada ao comparar instâncias por meio da interface.
Para obter mais informações sobre as regras para declarações de operador em interfaces, consulte membros abstratos estáticos em interfaces. Para obter um guia prático sobre como implementar esses padrões, consulte Explorar membros da interface abstrata estática.
Erros em tipo que implementa declaração de interface
Você pode encontrar os seguintes erros ao definir um tipo que implementa uma interface com static abstract ou static virtual métodos:
- CS8928: o tipo não implementa o membro da interface estática. O método não pode implementar o membro da interface porque ele não é estático.
- CS8930: A implementação explícita de um operador definido pelo usuário deve ser declarada estática
- CS8932: o método 'UnmanagedCallersOnly' não pode implementar um membro da interface no tipo
- CS9044: o tipo não implementa o membro da interface. O método não pode implementar implicitamente um membro inacessível.
Ao implementar um membro de interface estática abstrata ou interface virtual estática, declare o método de implementação usando o modificador static(CS8928). Ao contrário dos membros da interface de instância que são implementados por métodos de instância, membros abstratos estáticos exigem implementações estáticas porque o runtime os invoca no próprio tipo, não em uma instância.
Para implementações explícitas de operadores definidos pelo usuário de uma interface, inclua o static modificador na implementação (CS8930). Implementações explícitas de interface de operadores seguem o mesmo requisito estático que implementações implícitas.
Remova o System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute atributo de qualquer método que implemente um membro de interface (CS8932). Métodos marcados usando esse atributo só podem ser chamados de código não gerenciado e não podem participar da implementação da interface porque o runtime precisa chamá-los por meio do mecanismo de expedição de interface.
Se o método de implementação tiver acessibilidade mais restritiva do que o membro da interface (por exemplo, um private ou internal método que implementa um public membro da interface), use a sintaxe de implementação de interface explícita em vez de implementação implícita (CS9044). A implementação implícita exige que o membro de implementação seja pelo menos tão acessível quanto o membro da interface que ele implementa.
Para obter mais informações sobre como implementar membros da interface, consulte Interfaces e implementação de interface explícita.
Erros ao chamar membros da interface abstrata estática
Você pode ver os seguintes erros ao tentar chamar um membro definido como static abstract ou static virtual de uma interface:
- CS8920: A interface não pode ser usada como argumento de tipo. O membro estático não tem uma implementação mais específica na interface.
- CS8926: um membro de interface estático virtual ou abstrato só pode ser acessado em um parâmetro de tipo.
Ao usar uma interface com membros abstratos estáticos como um argumento de tipo, verifique se todos os membros abstratos estáticos têm uma implementação mais específica disponível (CS8920). Você verá esse erro quando o compilador não puder determinar qual implementação usar, normalmente porque várias hierarquias de interface fornecem implementações padrão conflitantes ou nenhuma implementação existe.
Acesse membros de interface estáticos abstratos ou virtuais estáticos por meio de um parâmetro de tipo que está restrito a implementar a interface, em vez de diretamente através do tipo de interface (CS8926). Por exemplo, use T.MemberName onde T é restringido por where T : IMyInterface, em vez de IMyInterface.MemberName. O compilador precisa de um tipo concreto para resolver qual implementação chamar e um parâmetro de tipo restrito fornece esse tipo concreto em tempo de compilação por meio de especialização genérica.
Para obter mais informações sobre como acessar membros abstratos estáticos, consulte membros abstratos estáticos em interfaces.