Resolver erros e avisos para ponteiros de delegado e de funções

Este artigo aborda os seguintes erros e avisos do compilador:

  • CS0059: Acessibilidade inconsistente: o tipo de parâmetro 'type' é menos acessível do que o delegado 'delegado'.
  • CS0123: Não existe uma sobrecarga de 'método' que seja compatível com o delegado 'delegado'.
  • CS0148: O delegate 'delegate' não tem um construtor válido.
  • CS0410: Não há sobrecarga para 'método' que tenha os parâmetros e tipos de retorno corretos.
  • CS0644:'classe' não pode derivar da classe especial 'classe'.
  • CS1599:O tipo de retorno de um método, delegado ou ponteiro de função não pode ser 'type'.
  • CS1958: Expressões inicializadoras de objetos e coleções não podem ser aplicadas a uma expressão de criação de delegados.
  • CS8755:'modificador' não pode ser usado como modificador num parâmetro de ponteiro de função.
  • CS8756: O 'tipo' do ponteiro de função não aceita argumentos de 'contagem'.
  • CS8757:Nenhuma sobrecarga de 'método' corresponde ao 'tipo' de ponteiro de função.
  • CS8758: Incompatibilidade de referência entre 'método' e 'tipo' de ponteiro de função.
  • CS8759: Não é possível criar um ponteiro de função para 'método' porque não é um método estático.
  • CS8786: A convenção de chamada de 'convenção' não é compatível com 'convenção'.
  • CS8787: Não é possível converter um grupo de métodos para um ponteiro de funções. (Está a faltar um '&'?)
  • CS8788:Não pode usar um método de extensão com um recetor como alvo de um operador '&'.
  • CS8789: O tipo de local declarado numa instrução fixa não pode ser um tipo de ponteiro de função.
  • CS8806: A convenção de chamada 'convenção' não é suportada pela linguagem de programação.
  • CS8807: 'especificador' não é um especificador válido de convenção de chamada para um ponteiro de função.
  • CS8808: 'modificador' não é um modificador válido para tipo de retorno de ponteiro de função. Os modificadores válidos são 'ref' e 'ref readonly'.
  • CS8809: Um tipo de retorno só pode ter um modificador 'modificador'.
  • CS8811:Não é possível converter o grupo de métodos 'método' para delegar o tipo 'tipo'.
  • CS8909: A comparação de ponteiros de função pode produzir um resultado inesperado, uma vez que os apontadores para a mesma função podem ser distintos.
  • CS8911: Não é suportado o uso de um tipo de ponteiro de função neste contexto.

Incompatibilidades entre assinaturas de delegados

  • CS0059: Acessibilidade inconsistente: o tipo de parâmetro 'type' é menos acessível do que o delegado 'delegate'.
  • CS0123: Nenhuma sobrecarga para 'método' corresponde ao delegado 'delegado'.
  • CS0148: O delegado 'delegado' não tem um construtor válido.
  • CS0410: Nenhuma sobrecarga para o 'método' tem os parâmetros e tipos de retorno corretos.

Quando cria ou atribui um delegado, o compilador verifica se a assinatura do método alvo corresponde à declaração do tipo de delegado. A assinatura inclui os tipos de parâmetros, o tipo de retorno e a acessibilidade. Para consultar as regras completas, veja Delegates e Restrições de acessibilidade na especificação C#.

  • Altere todos os tipos de parâmetros na declaração de delegado para tipos que sejam pelo menos tão acessíveis quanto o próprio delegado (CS0059). Um public delegado não pode referenciar um tipo menos acessível na sua lista de parâmetros porque os chamadores fora da assembleia não poderiam fornecer o argumento. Para obter mais informações, consulte Modificadores de acesso.
  • Ajuste a assinatura do método ou a assinatura do delegado para que os tipos de parâmetros e o tipo de retorno coincidam exatamente (CS0123). O compilador requer uma correspondência exata de assinatura quando atribui um método a um delegado.
  • Verifique se o delegado foi compilado por um compilador conforme (CS0148). Este erro ocorre quando se importa um assembly gerido construído por um compilador que produziu um construtor de delegados mal formado. Recompile a assembly com um compilador compatível com normas para resolver o erro.

Observação

O CS0410 já não é produzido pelo compilador C# atual. Agora, a mesma condição produz o CS0123. Assemblies mais antigos compilados com compiladores anteriores podem ainda referenciar este código de erro.

CS0148 é um diagnóstico exclusivo para compilação:

Observação

Este aviso só é reportado durante operações explícitas de Build ou Rebuild . Não aparece durante a digitação no IDE como parte do diagnóstico do IntelliSense. Isto significa que, se corrigires o aviso usando o campo ou removendo-o, o aviso pode persistir na lista de erros até voltares a construir ou reconstruir o projeto.

Restrições de tipo de delegado

  • CS0644:'classe' não pode derivar da classe especial 'classe'.
  • CS1599:O tipo de retorno de um metodo, delegado ou ponteiro de função não pode ser 'tipo'.
  • CS1958: Expressões inicializadoras de objetos e coleções não podem ser aplicadas a uma expressão de criação de delegados.

A linguagem C# restringe como se podem usar certos tipos especiais, incluindo System.Delegate. Para as regras completas sobre declarações de delegados, veja Delegates e Delegates na especificação C#.

  • Remova a classe base explícita e use uma delegate declaração em vez disso (CS0644). As classes não podem herdar explicitamente de System.Delegate, System.Enum, System.ValueType, ou System.Array. O compilador utiliza estes tipos como classes base implícitas. Por exemplo, toda delegate declaração deriva implicitamente de System.Delegate.
  • Mude o tipo de devolução para um tipo que seja permitido como valor de retorno (CS1599). Certos tipos na biblioteca de classes .NET, como TypedReference, RuntimeArgumentHandle e ArgIterator, não podem ser usados como tipos de retorno para métodos, delegados ou ponteiros de função porque podem potencialmente permitir operações de pilha inseguras.
  • Remover as chaves após a expressão de criação de delegado (CS1958). Os delegados não têm membros que possas definir através da sintaxe do inicializador de objetos ou coleções. Se tiver { } depois de uma expressão new DelegateType(method), retire as chaves.

Incompatibilidades na assinatura do ponteiro de função

  • CS8755:'modificador' não pode ser usado como modificador num parâmetro de ponteiro de função.
  • CS8756: O 'tipo' do ponteiro de função não aceita argumentos de 'contagem'.
  • CS8757:Nenhuma sobrecarga para 'método' corresponde ao ponteiro de função 'tipo'.
  • CS8758: Desajuste de referência entre 'método' e 'tipo' de ponteiro de função.
  • CS8759: Não é possível criar um ponteiro de função para 'método' porque não é um método estático.
  • CS8787:Não é possível converter o grupo de métodos em ponteiro de funções. (Estás a faltar um '&'?)
  • CS8788:Não pode usar um método de extensão com um recetor como alvo de um operador '&'.
  • CS8811:Não é possível converter o grupo de métodos 'método' para delegar o tipo 'tipo'.

Quando atribui um método a um ponteiro de função usando o operador address-of (&), o compilador verifica se a assinatura do método corresponde ao tipo de ponteiro de função. Para as regras completas sobre declarações e utilização de ponteiros de função, veja Ponteiros de função e código inseguro.

  • Remover o modificador não suportado do parâmetro do ponteiro da função (CS8755). Os parâmetros do ponteiro de função suportam modificadores apenas ref, out e in. Outros modificadores de parâmetro, como params, não são válidos em declarações de tipos de ponteiro de função.
  • Ajuste o número de argumentos no local da chamada para corresponder ao número de parâmetros do ponteiro de função (CS8756). O tipo de ponteiro de função define um número fixo de parâmetros, e tens de passar exatamente esse número de argumentos.
  • Ajuste a assinatura do método para que os seus tipos de parâmetros, tipo de retorno e contagem de parâmetros correspondam ao tipo de ponteiro da função (CS8757). Ao contrário dos delegados, os ponteiros de função não suportam conversões implícitas entre assinaturas de métodos compatíveis. A correspondência tem de ser exata.
  • Alinhe os modificadores ref, out ou in entre os parâmetros do método e os parâmetros do tipo de ponteiro de função (CS8758). O tipo de referência de cada parâmetro deve corresponder exatamente. Um parâmetro ref não pode satisfazer uma posição in ou out no tipo de ponteiro da função.
  • Mude o método alvo para static (CS8759). Os ponteiros de função só podem apontar para métodos estáticos porque representam endereços brutos de funções sem uma instância de objeto associada.
  • Adicione o operador & antes do conjunto de métodos ao atribuir a um ponteiro de função (CS8787). Ao contrário dos delegados, os ponteiros de função requerem o operador de endereço explícito: delegate*<void> ptr = &MyMethod;.
  • Use um método estático em vez de um método de extensão com um recetor (CS8788). O & operador requer uma referência direta do método. Os métodos de extensão chamados numa instância têm um recetor implícito que não pode ser capturado num ponteiro de função.
  • Remova o operador & e use a sintaxe de delegação em vez disso, ou altere o tipo de destino de uma delegação para um ponteiro de função (CS8811). O & operador produz um ponteiro de função, não um delegado. Para atribuir um grupo de métodos a um tipo de delegado, omita a & sintaxe e usa a sintaxe padrão de criação de delegados.

Convenções de chamada de ponteiro de função e tipos de retorno

  • CS8786: Chamar convenção de 'convenção' não é compatível com 'convenção'.
  • CS8806: A convenção de chamada 'convenção' não é suportada pela linguagem de programação.
  • CS8807: 'especificador' não é um especificador de convenção de chamada válido para um ponteiro de função.
  • CS8808: 'modificador' não é um modificador válido de retorno de apontador de função. Modificadores válidos são 'ref' e 'ref readonly'.
  • CS8809: Um tipo de retorno só pode ter um modificador chamado 'modificador'.

As declarações do ponteiro de função incluem uma convenção de chamada e modificadores opcionais de tipo de retorno. O compilador valida estas opções. Para as regras completas, veja Ponteiros de função.

  • Altera a convenção de chamada do método ou a convenção de chamada do tipo de ponteiro de função para que coincidam (CS8786). Quando atribui um método a um ponteiro de função, as convenções de chamadas devem ser compatíveis. Por exemplo, um método usando Cdecl não pode ser atribuído a um ponteiro de função declarado com Stdcall.
  • Use uma convenção de chamada suportada na declaração do ponteiro de função (CS8806). A linguagem suporta managed e unmanaged. Para uma convenção específica não gerida, use a unmanaged palavra-chave com a convenção entre parênteses, como unmanaged[Cdecl], unmanaged[Stdcall], unmanaged[Thiscall], ou unmanaged[Fastcall].
  • Substitua o especificador inválido por uma convenção de chamada suportada (CS8807). Use managed, unmanaged, ou unmanaged com um tipo de convenção de chamada entre colchetes (por exemplo, unmanaged[Cdecl]).
  • Use apenas ref ou ref readonly como modificador do tipo de retorno (CS8808). Outros modificadores, como out ou in, não são válidos para tipos de retorno de ponteiros de função.
  • Remover o modificador de tipo de retorno duplicado para que apareça apenas um ref ou ref readonly (CS8809). O compilador permite, no máximo, um modificador de tipo de retorno numa declaração de ponteiro de função.

Restrições de utilização do ponteiro de função

  • CS8789: O tipo de local declarado numa instrução fixa não pode ser um tipo de ponteiro de função.
  • CS8909: A comparação de ponteiros de função pode produzir um resultado inesperado, uma vez que os apontadores para a mesma função podem ser distintos.
  • CS8911: Não é suportado o uso de um tipo de ponteiro de função neste contexto.

O compilador restringe a forma como os tipos de apontadores de função podem ser usados em certos contextos. Para as regras completas, veja Ponteiros de função.

  • Altere o tipo de variável local na fixed instrução para um tipo de ponteiro de dados em vez de um tipo de ponteiro de função (CS8789). A instrução fixed fixa objetos geridos na memória para acesso aos dados. Os ponteiros de função representam endereços de código, não dados, e não podem ser fixados.
  • Evite comparar ponteiros de função para igualdade (CS8909). Este aviso indica que comparar ponteiros de função com == ou != pode produzir resultados inesperados. O runtime pode devolver diferentes ponteiros para a mesma função devido a detalhes de implementação, como o uso de thunking ou a compilação JIT. Para suprimir o aviso quando confirmar que a comparação é intencional, use #pragma warning disable CS8909.
  • Mover a utilização do apontador de função para um contexto suportado (CS8911). Os tipos de apontadores de função não podem ser usados em certas posições, como argumentos de atributos ou expressões typeof. Reestruture o código para evitar o uso de tipos de apontadores de função em contextos não suportados.