Resolver erros e avisos gerados por expressões proibidas em árvores de expressões

Este artigo aborda os seguintes avisos do compilador:

  • CS0765 - os métodos parciais com apenas uma declaração de definição ou os métodos condicionais removidos não podem ser usados em árvores de expressão.
  • CS0831 - uma árvore de expressão não pode conter um acesso à base.
  • CS0832 - uma árvore de expressão não pode conter um operador de atribuição
  • CS0834 - uma expressão lambda com um corpo de instrução não pode ser convertida em uma árvore de expressão.
  • CS0835 - Não é possível converter lambda em uma árvore de expressões cujo argumento de tipo 'type' não é um tipo delegado.
  • CS0838 - uma árvore de expressão não pode conter um inicializador de matriz multidimensional.
  • CS0845 - uma árvore de expressão da expressão lambda não pode conter um operador de coalescência com um literal nulo ou padrão no lado esquerdo.
  • CS0853 - uma árvore de expressão não pode conter uma especificação de argumento nomeado.
  • CS0854 - uma árvore de expressão não pode conter uma chamada ou invocação que utilize argumentos opcionais.
  • CS0855 - uma árvore de expressão não pode conter uma propriedade indexada.
  • CS1944 - uma árvore de expressão não pode conter uma operação de ponteiro insegura.
  • CS1945 - uma árvore de expressão não pode conter uma expressão de método anônimo.
  • CS1946 - uma expressão de método anônimo não pode ser convertida em uma árvore de expressão.
  • CS1951 - umárvore de expressão da expressão lambda não pode conter um parâmetro ref, in ou out.
  • CS1952 - Uma árvore de expressão lambda não pode conter um método com argumentos variáveis.
  • CS1963 - uma árvore de expressão não pode conter uma operação dinâmica.
  • CS1989 - As expressões lambda assíncronas não podem ser convertidas em árvores de expressões.
  • CS2037 - Uma árvore de expressão da expressão lambda não pode conter uma chamada COM com a omissão de ref nos argumentos.
  • CS7053 - uma árvore de expressão não pode conter o "recurso".
  • CS8072 - Uma árvore de expressão da expressão lambda não pode conter um operador nulo em propagação.
  • CS8074 - Uma árvore de expressão da expressão lambda não pode conter um inicializador de dicionário.
  • CS8075 - Um método de extensão Add não tem suporte para um inicializador de coleção em uma expressão lambda.
  • CS8110 - uma árvore de expressão não pode conter uma referência a uma função local.
  • CS8122 - uma árvore de expressão não pode conter um operador de correspondência padrão 'is'.
  • CS8143 - uma árvore de expressão não pode conter um literal de tupla.
  • CS8144 - uma árvore de expressão não pode conter uma conversão de tupla.
  • CS8153 - O lambda da árvore de expressão pode não conter uma chamada para um método, uma propriedade ou um indexador que é retornado por referência.
  • CS8155 - Expressões lambda que retornam por referência não podem ser convertidas para árvores de expressão.
  • CS8188 - uma árvore de expressão não pode conter uma expressão de lançamento.
  • CS8198 - uma árvore de expressão não pode conter uma declaração de variável de argumento de saída.
  • CS8207 - uma árvore de expressão não pode conter um descarte.
  • CS8382 - uma árvore de expressão não pode conter um operador de tupla == ou !=.
  • CS8514 - uma árvore de expressão não pode conter uma expressão de alternância.
  • CS8640 - a árvore de expressão não pode conter valor de estrutura de referência ou tipo restrito.
  • CS8642 - uma árvore de expressão não pode conter uma atribuição coalescente nula.
  • CS8790 - uma árvore de expressão não pode conter um padrão System.Index ou System.Range de acesso ao indexador.
  • CS8791 - uma árvore de expressão não pode conter uma expressão do índice from-end ('^').
  • CS8792 - uma árvore de expressão não pode conter um intervalo de expressão ('..').
  • CS8810 - '&' em grupos de métodos não pode ser usado em árvores de expressões.
  • CS8849 - uma árvore de expressão não pode conter uma -expression with.
  • CS8927 - uma árvore de expressão não pode conter um acesso a um membro de interface virtual estático ou abstrato.
  • CS8952 - uma árvore de expressão não pode conter uma conversão de manipulador de cadeia de caracteres interpolada.
  • CS8972 - Uma expressão lambda com atributos não pode ser convertida em uma árvore de expressão.
  • CS9170 - uma árvore de expressão não pode conter um acesso ou conversão de matriz em linha.
  • CS9175 - uma árvore de expressão não pode conter uma expressão de coleção.

Restrições da árvore de expressão

Todos os erros da lista anterior indicam que você deve ter usado um tipo de expressão do C# que não é permitido em uma árvore de expressão. Na maioria dos casos, as expressões proibidas representam a sintaxe introduzida após o C# 3.0. Essas expressões são proibidas porque sua permissão criaria uma alteração interruptiva em todas as bibliotecas que analisam árvores de expressão. Todas as bibliotecas precisariam ser aprimoradas para analisar as novas expressões do C# se as construções mais recentes fossem permitidas.

As seguintes expressões são proibidas:

Outras restrições são:

  • Atributos não podem ser aplicados à expressão lambda, aos parâmetros ou ao retorno.
  • A expressão lambda deve ser conversível em um tipo derivado de System.Linq.Expressions.Expression cujo parâmetro de tipo seja um tipo delegado.
  • Os parâmetros nomeados e opcionais são restritos. A expressão não pode chamar um método que especifique os argumentos chamados e não pode utilizar o valor padrão de um parâmetro opcional.
  • Inicializadores de dicionário não são permitidos. Métodos de extensão Add também não são.
  • A expressão de destino deve ser uma expressão lambda. Constantes e variáveis não são permitidas, mas uma expressão lambda que retorna uma constante ou variável é.
  • Não são permitidas operações inseguras com ponteiros.
  • Chamadas COM devem incluir ref em argumentos; isso não pode ser implícito.
  • A palavra-chave __arglist não suportada não é permitida.