Resolver erros e avisos para delegados e ponteiros de função

Este artigo aborda os seguintes erros e avisos do compilador:

  • CS0059: Acessibilidade inconsistente: o tipo de parâmetro 'type' é menos acessível que o delegado 'delegate'.
  • CS0123: nenhuma sobrecarga para 'method' corresponde ao delegado 'delegate'.
  • CS0148: O delegate 'delegate' não tem um construtor válido.
  • CS0410: nenhuma sobrecarga para 'method' tem os tipos de parâmetro e retorno corretos.
  • CS0644: 'class' não pode derivar da classe especial 'class'.
  • CS1599: O tipo de retorno de um método, delegado ou ponteiro de função não pode ser "tipo".
  • CS1958: Expressões de inicializador de objeto e coleção podem não ser aplicadas a uma expressão de criação de delegado.
  • CS8755: 'modificador' não pode ser usado como modificador em um parâmetro de ponteiro de função.
  • CS8756: o ponteiro de função 'type' não aceita 'count' argumentos.
  • CS8757: nenhuma sobrecarga para 'method' corresponde ao ponteiro de função 'type'.
  • CS8758: Incompatibilidade de ref entre 'method' e function pointer 'type'.
  • CS8759: Não é possível criar um ponteiro de função para 'método' porque ele não é um método estático.
  • CS8786: a convenção de chamada de 'convention' não é compatível com 'convention'..
  • CS8787: Não é possível converter um conjunto de métodos em ponteiro de função. (Você está esquecendo um '&'?)
  • CS8788: não é possível usar um método de extensão com um receptor como destino de um operador '&'.
  • CS8789: O tipo de um local declarado em uma instrução fixa não pode ser um tipo de ponteiro de função.
  • CS8806: A convenção de chamada de "convenção" não é suportada pela linguagem.
  • CS8807: 'specifier' não é um especificador de convenção de chamada válido para um ponteiro de função.
  • CS8808: 'modifier' não é um modificador de tipo de retorno de ponteiro de função válido. Modificadores válidos são 'ref' e 'ref readonly'.
  • CS8809: um tipo de retorno só pode ter um modificador 'modifier'
  • CS8811: Não é possível converter o grupo de métodos 'method' para delegar o tipo 'type'.
  • CS8909: a comparação de ponteiros de função pode produzir um resultado inesperado, já que os ponteiros para a mesma função podem ser distintos.
  • CS8911: não há suporte para usar um tipo de ponteiro de função nesse contexto.

Incompatibilidades de assinatura de delegado

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

Quando você cria ou atribui um delegado, o compilador verifica se a assinatura do método de destino corresponde à declaração do tipo delegado. A assinatura inclui os tipos de parâmetro, o tipo de retorno e a acessibilidade. Para obter as regras completas, consulte Delegados e restrições de acessibilidade na especificação C#.

  • Altere todos os tipos de parâmetro na declaração delegada para tipos que são pelo menos tão acessíveis quanto o próprio delegado (CS0059). Um delegado public não pode referenciar um tipo menos acessível em sua lista de parâmetros porque os chamadores fora do assembly não seriam capazes de fornecer o argumento. Para obter mais informações, consulte Modificadores de Acesso.
  • Ajuste a assinatura do método ou a assinatura delegada para que os tipos de parâmetro e o tipo de retorno correspondam exatamente (CS0123). O compilador requer uma correspondência de assinatura exata quando você atribui um método a um delegado.
  • Verifique se o delegado foi compilado por um compilador compatível (CS0148). Esse erro ocorre quando você importa um assembly gerenciado criado por um compilador que produziu um construtor delegado mal formado. Recompile o assembly com um compilador compatível com padrões para resolver o erro.

Note

O CS0410 não é mais produzido pelo compilador C# atual. A mesma condição agora produz CS0123 em vez disso. Assemblies mais antigos compilados com compiladores anteriores ainda podem referenciar esse código de erro.

CS0148 é um diagnóstico somente de compilação:

Note

Esse aviso só é relatado durante operações explícitas de Compilação ou Recompilação. Ele não aparece durante a digitação no IDE como parte do diagnóstico do IntelliSense. Isso significa que, se você corrigir o aviso usando o campo ou removendo-o, o aviso poderá persistir na lista de erros até que você compile ou recompile o projeto novamente.

Restrições de tipo de delegado

  • CS0644: 'class' não pode derivar da classe especial 'class'.
  • CS1599: O tipo de retorno de um método, delegado ou ponteiro de função não pode ser 'type'.
  • CS1958: Expressões de inicializador de objeto e coleção podem não ser aplicadas a uma expressão de criação de delegado.

A linguagem C# restringe como você pode usar determinados tipos especiais, incluindo System.Delegate. Para obter as regras completas sobre declarações de delegado, consulte Delegados e Delegados na especificação C#.

  • Remova a classe base explícita e use uma delegate declaração (CS0644). As classes não podem herdar explicitamente de System.Delegate, System.Enum, System.ValueTypeou System.Array. O compilador usa esses tipos como classes base implícitas. Por exemplo, cada delegate declaração deriva implicitamente de System.Delegate.
  • Altere o tipo de retorno para um tipo permitido como um valor retornado (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 habilitar operações de pilha inseguras.
  • Remova as chaves após a expressão de criação do delegado (CS1958). Delegados não têm membros que podem ser definidos por meio da sintaxe de inicialização de objetos ou coleções. Se você tiver { } após uma expressão new DelegateType(method), remova as chaves.

Incompatibilidades de assinatura de ponteiro de função

  • CS8755: 'modificador' não pode ser usado como modificador em um parâmetro de ponteiro de função.
  • CS8756: o ponteiro de função 'type' não aceita 'count' argumentos.
  • CS8757: nenhuma sobrecarga para 'method' corresponde ao ponteiro de função 'type'.
  • CS8758: Incompatibilidade de ref entre 'method' e function pointer 'type'.
  • CS8759: Não é possível criar um ponteiro de função para 'método' porque ele não é um método estático.
  • CS8787: Não é possível converter o agrupamento de métodos em ponteiro de função. (Você está esquecendo de um '&'?)
  • CS8788: não é possível usar um método de extensão com um receptor como destino de um operador '&'.
  • CS8811: Não é possível converter o grupo de métodos 'method' para delegar o tipo 'type'.

Quando você 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 obter as regras completas sobre declarações de ponteiro de função e uso, consulte ponteiros de função e código não seguro.

  • Remova o modificador sem suporte do parâmetro de ponteiro de função (CS8755). Os parâmetros de ponteiros de função dão suporte apenas aos modificadores ref, out e in. Outros modificadores de parâmetro, como params, não são válidos em declarações de tipo de ponteiro de função.
  • Altere o número de argumentos no local da chamada para corresponder à contagem 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 você deve passar exatamente esse número de argumentos.
  • Ajuste a assinatura do método para que seus tipos de parâmetro, tipo de retorno e contagem de parâmetros correspondam ao tipo de ponteiro de função (CS8757). Ao contrário dos delegados, os ponteiros de função não suportam conversões implícitas entre assinaturas de método compatíveis. A correspondência deve 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 ref 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 de função.
  • Altere o método de destino para static (CS8759). Os ponteiros de função só podem apontar para métodos estáticos porque representam endereços de função brutos sem uma instância de objeto associada.
  • Adicione o operador & antes do grupo de métodos ao atribuir a um ponteiro de função (CS8787). Ao contrário dos delegados, os ponteiros de função exigem 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 receptor (CS8788). O & operador requer uma referência de método direto. Os métodos de extensão invocados em uma instância possuem um receptor implícito que não pode ser capturado por um ponteiro de função.
  • Remova o operador & e use a sintaxe de delegado em vez disso, ou altere o tipo de destino de um delegado 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 delegado, omita o & e use a sintaxe de criação de delegados padrão.

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

  • CS8786: a convenção de chamada 'convention' não é compatível com 'convention'.
  • CS8806: a convenção de chamada 'convention' não é suportada pela linguagem.
  • CS8807: 'specifier' não é um especificador de convenção de chamada válido para um ponteiro de função.
  • CS8808: 'modifier' não é um modificador de tipo de retorno de ponteiro de função válido. Os modificadores válidos são 'ref' e 'ref readonly'.
  • CS8809: Um tipo de retorno só pode ter um único modificador 'modifier'.

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

  • Altere a convenção de chamada do método ou a convenção de chamada do tipo de ponteiro de função para que elas correspondam (CS8786). Quando você atribui um método a um ponteiro de função, as convenções de chamada devem ser compatíveis. Por exemplo, um método que usa Cdecl não pode ser atribuído a um ponteiro de função declarado com Stdcall.
  • Use uma convenção de chamada com suporte na declaração de ponteiro de função (CS8806). O idioma suporta managed e unmanaged. Para uma convenção não gerenciada específica, use a unmanaged palavra-chave com a convenção em colchetes, como unmanaged[Cdecl], unmanaged[Stdcall], unmanaged[Thiscall]ou unmanaged[Fastcall].
  • Substitua o especificador inválido por uma convenção de chamada com suporte (CS8807). Use managed, unmanagedou unmanaged com um tipo de convenção de chamada em colchetes (por exemplo, unmanaged[Cdecl]).
  • Use apenas ref ou ref readonly como modificador de tipo de retorno (CS8808). Outros modificadores, como out ou in, não são válidos para tipos de retorno de ponteiro de função.
  • Remova o modificador de tipo de retorno duplicado para que apenas um ref ou ref readonly apareça (CS8809). O compilador permite no máximo um modificador de tipo de retorno em uma declaração de ponteiro de função.

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

  • CS8789: O tipo de um local declarado em uma 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, já que os ponteiros para a mesma função podem ser distintos.
  • CS8911: não há suporte para usar um tipo de ponteiro de função nesse contexto.

O compilador restringe como os tipos de ponteiro de função podem ser usados em determinados contextos. Para conhecer as regras completas, consulte 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 gerenciados na memória para acesso a dados. Os ponteiros de função representam endereços de código, não dados e não podem ser fixados.
  • Evite realizar comparações de igualdade entre ponteiros de função (CS8909). Esse aviso indica que comparar ponteiros de função com == ou != pode produzir resultados inesperados. O ambiente de execução pode retornar ponteiros diferentes para a mesma função devido a detalhes de implementação, como thunking ou compilação JIT. Para suprimir o aviso ao confirmar que a comparação é intencional, use #pragma warning disable CS8909.
  • Mova o uso do ponteiro de função para um contexto com suporte (CS8911). Tipos de ponteiro de função não podem ser usados em determinadas posições, como argumentos de atributo ou expressões typeof. Reestruture o código para evitar o uso de tipos de ponteiro de função em contextos não suportados.