Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Vários erros estão relacionados com a declaração e utilização de expressões lambda e métodos anónimos:
- CS0407: 'método' tem o tipo de retorno errado.
- CS0428: Não é possível converter o grupo de métodos 'Identificador' para o tipo 'tipo' não delegado. Tinhas intenção de invocar o método?
- CS0748: Uso inconsistente de parâmetros lambda; os tipos de parâmetros devem ser todos explícitos ou implícitos.
- CS0815: Não é possível atribuir 'expressão' a uma variável tipada implicitamente.
- CS0828: Não é possível atribuir 'expressão' à propriedade do tipo anónimo.
- CS0837: O primeiro operando de um operador 'is' ou 'as' pode não ser uma expressão lambda, método anónimo ou grupo de métodos.
- CS1065: Os valores padrão não são válidos neste contexto.
- CS1621: A demonstração de rendimento não pode ser usada dentro de um método anônimo ou expressão lambda.
-
CS1628: Não é possível usar
inrefououtparâmetro dentro de um método anônimo, expressão lambda ou expressão de consulta. - CS1632: O controle não pode deixar o corpo de um método anônimo ou expressão lambda.
- CS1643: Nem todos os caminhos de código retornam um valor no método anónimo do tipo 'tipo'.
- CS1660: Não é possível converter a expressão lambda para o tipo 'tipo' porque não é um tipo delegado.
- CS1661: Não é possível converter bloco de método anónimo para tipo 'tipo' porque os tipos de parâmetros não correspondem aos tipos de parâmetro do delegado.
- CS1662: Não é possível converter bloco de método anónimo para tipo delegado pretendido porque alguns dos tipos de retorno no bloco não são implicitamente convertíveis para o tipo de retorno de delegado.
- CS1673: Métodos anônimos, expressões lambda e expressões de consulta dentro de structs não podem acessar membros de instância de 'this'.
- CS1676: O parâmetro 'número' deve ser declarado com a palavra-chave 'palavra-chave'.
- CS1677:O parâmetro 'número' não deve ser declarado com a palavra-chave 'palavra-chave'.
- CS1678: O parâmetro 'número' é declarado como tipo 'tipo1', mas deve ser 'tipo2'.
- CS1686: A variável local ou seus membros não podem ter seu endereço tomado e ser usado dentro de um método anônimo ou expressão lambda.
- CS1688:Não é possível converter bloco de método anónimo sem uma lista de parâmetros para delegar o tipo 'delegate' porque tem um ou mais parâmetros de saída.
- CS1706: A expressão não pode conter métodos anônimos ou expressões lambda.
- CS1731: Não é possível converter expressão em delegar porque alguns dos tipos de retorno no bloco não são implicitamente convertíveis para o tipo de retorno de delegado.
- CS1732: Parâmetro esperado.
- CS1764: Não pode usar local fixo dentro de um método anónimo, expressão lambda ou expressão de consulta.
- CS8030: Função anônima convertida em um delegado de retorno nulo não pode retornar um valor.
- CS8175: Não é possível usar ref local dentro de um método anônimo, expressão lambda ou expressão de consulta.
- CS8820: Uma função anónima estática não pode conter uma referência a 'variável'.
- CS8821: Uma função anónima estática não pode conter uma referência a 'isto' ou 'base'.
- CS8916: Atributos em expressões lambda requerem uma lista de parâmetros entre parênteses.
- CS8917: O tipo de delegado não pôde ser inferido.
- CS8934: Não é possível converter um método anónimo para o tipo 'tipo' porque o tipo de retorno não corresponde ao tipo de retorno delegado.
-
CS8975: A palavra-chave
varcontextual não pode ser usada como um tipo de retorno lambda explícito. - CS9098: Parâmetro lambda digitado implicitamente '...' não pode ter um valor padrão.
Além disso, vários avisos relacionam-se com a declaração e utilização de expressões lambda:
- CS0467: Ambiguidade entre método 'método' e não-método 'não-método'. Usando o grupo de métodos.
- CS1911:O acesso ao membro através de uma palavra-chave 'base' a partir de um método anónimo, expressão lambda, expressão de consulta ou iterador resulta em código não verificável.
- CS8971: InterpolatedStringHandlerArgument não tem efeito quando aplicado a parâmetros lambda e será ignorado no site de chamada.
- CS8974: Conversão do grupo de métodos 'método' em tipo 'tipo' não-delegado. Tinhas intenção de invocar o método?
- CS9099: O valor do parâmetro padrão não corresponde no tipo de delegado de destino.
- CS9100: O parâmetro tem modificador de parâmetros no lambda, mas não no tipo de delegado de destino.
O compilador também produz a seguinte mensagem informativa :
- CS9236: A compilação requer a vinculação da expressão lambda pelo menos vezes contadas. Considere declarar a expressão lambda com tipos de parâmetros explícitos ou, se a chamada de método que contém for genérica, considere utilizar argumentos de tipo explícitos.
Limitações de sintaxe em expressões lambda
-
CS0837: O primeiro operando de um
isoperador ouaspode não ser uma expressão lambda, método anónimo ou grupo de métodos. -
CS1621: A
yieldinstrução não pode ser usada dentro de um método anônimo ou expressão lambda. -
CS1628: Não é possível usar
in,refououtparâmetro dentro de um método anônimo, expressão lambda ou expressão de consulta. - CS1632: O controle não pode deixar o corpo de um método anônimo ou expressão lambda.
-
CS1673: Métodos anônimos, expressões lambda e expressões de consulta dentro de structs não podem acessar membros de instância do
this. - CS1686: A variável local ou seus membros não podem ter seu endereço tomado e ser usado dentro de um método anônimo ou expressão lambda.
- CS1706: A expressão não pode conter métodos anónimos ou expressões lambda.
- CS1764: Não pode usar local fixo dentro de um método anónimo, expressão lambda ou expressão de consulta.
- CS1911: Aviso: O acesso ao membro através de uma palavra-chave 'base' a partir de um método anónimo, expressão lambda, expressão de consulta ou iterador resulta em código não verificável.
- CS8175: Não é possível usar ref local dentro de um método anônimo, expressão lambda ou expressão de consulta.
- CS8820: Uma função anónima estática não pode conter uma referência a 'variável'.
- CS8821: Uma função anónima estática não pode conter uma referência a 'isto' ou 'base'.
- CS8971: Aviso: InterpolatedStringHandlerArgument não tem efeito quando aplicado a parâmetros lambda e será ignorado no local da chamada.
- CS9236: Informativo: Compilar requer ligar a expressão lambda pelo menos um número específico de vezes. Considere declarar a expressão lambda com tipos de parâmetros explícitos ou, se a chamada de método que a contém for genérica, considere usar argumentos de tipo explícitos.
O compilador proíbe certos construtos C# dentro de expressões lambda e métodos anónimos. Estas restrições existem porque o compilador transforma lambdas e métodos anónimos em invocações de delegados ou árvores de expressão, e alguns construtos não podem ser representados nessas formas. Para mais informações, consulte a secção de expressões de funções anónimas da especificação C#.
Pode corrigir estes erros utilizando as seguintes orientações:
- Mova qualquer instrução
yield returnouyield breakpara fora do corpo da expressão lambda e para o método do iterador envolvente, ou converta a expressão lambda para uma função local, que suporta instruçõesyield(CS1621). - Evite referenciar
in,ref, ououtparâmetros do método de encerramento dentro do corpo lambda. Quando a lambda captura estes parâmetros como parte de um fecho, a semântica de referência de parâmetros semelhantes arefnão pode ser preservada. Copie o valor para uma variável local e use esse local em vez disso, ou converta o lambda numa função local (CS1628). - Remova qualquer instrução
break,gotooucontinueque transfira o controlo para fora do corpo lambda. As instruções de fluxo de controlo devem direcionar rótulos ou loops dentro do mesmo corpo lambda (CS1632). - Num tipo
struct, evite referenciar membros de instância através dethisem uma expressão lambda, método anónimo ou expressão de consulta. Como o compilador capturathispor valor em umstruct, as mutações dentro da lambda não afetam a instância original. Extrair os valores necessários dos membros em variáveis locais antes do lambda, ou converter para uma função local, que pode acederthisdiretamente (CS1673). - Não escolha o endereço de uma variável local que a lambda também captura. O compilador move as variáveis capturadas para um objeto de fecho alocado no heap, tornando o seu endereço instável. Separe a lógica de captação de endereços da lambda, ou use uma função local em vez disso (CS1686).
- Mova a expressão lambda ou o método anónimo para fora da expressão contenda que a proíbe. Algumas expressões, como os construtores de atributos, não suportam expressões lambda ou métodos anónimos como argumentos (CS1706).
- Não uses uma
fixedvariável local dentro de um corpo lambda. A garantia de fixação dafixedinstrução aplica-se apenas ao âmbito de anexo, não ao fecho que o compilador gera (CS1764). - Não uses um
reflocal dentro de um corpo lambda. Tal como osrefparâmetros, também asrefvariáveis locais não podem ser capturadas no fecho que o compilador gera para a lambda. Atribuir o valor a uma variável nãoreflocal, ou converter a lambda numa função local (CS8175). - Não use uma expressão lambda, método anónimo ou grupo de métodos como primeiro operando do
isoperador ouas. Estes construtos não têm um tipo que possa ser testado em tempo de execução. Atribua primeiro a expressão a uma variável e depois testa a variável (CS0837). - Remover o
staticmodificador do lambda, ou remover a referência à variável capturada. Umstaticlambda proíbe explicitamente a captura de variáveis locais e parâmetros para evitar alocações de fecho não intencionais. Se precisares de referenciar variáveis exteriores, remove ostaticmodificador. Se quiseres manter a alocação do heap mínima, passa os valores como parâmetros ao lambda (CS8820, CS8821). - Remover o InterpolatedStringHandlerArgumentAttribute do parâmetro lambda, ou mover a lógica para um método onde o atributo seja honrado. O compilador ignora este atributo nos parâmetros lambda porque as invocações lambda não usam a mesma redução interpolada do handler de strings que as chamadas de método normais (CS8971).
- Evite chamar um membro virtual através da
basepalavra-chave dentro de um método lambda ou anónimo. O compilador gera uma chamada não virtual através de um método auxiliar, que produz código não verificável. Considere extrair abasechamada para um método separado e chamar esse método a partir do lambda em vez disso (CS1911). - Reduzir a complexidade das chamadas de método sobrecarregadas que aceitam expressões lambda, ou adicionar informação de tipos de forma explícita. Quando o compilador tem de ligar uma expressão lambda várias vezes para resolver sobrecargas, emite este diagnóstico informativo. Declarar o lambda com tipos de parâmetros explícitos, ou fornecer argumentos explícitos de tipo na chamada genérica ao método, reduz o número de passagens de ligação que o compilador deve realizar (CS9236).
Parâmetros e retornos de expressão do Lambda
- CS0748: Uso inconsistente de parâmetros lambda; os tipos de parâmetros devem ser todos explícitos ou implícitos.
- CS1065: Os valores padrão não são válidos neste contexto.
- CS1643: Nem todos os caminhos de código retornam um valor no método anónimo do tipo 'tipo'.
- CS1661: Não é possível converter bloco de método anónimo para tipo 'tipo' porque os tipos de parâmetros não correspondem aos tipos de parâmetro do delegado.
- CS1662: Não é possível converter bloco de método anónimo para tipo delegado pretendido porque alguns dos tipos de retorno no bloco não são implicitamente convertíveis para o tipo de retorno de delegado.
- CS1676: O parâmetro 'número' deve ser declarado com a palavra-chave 'palavra-chave'.
- CS1677:O parâmetro 'number' não deve ser declarado com a palavra-chave 'keyword'.
- CS1678: O parâmetro 'número' é declarado como tipo 'tipo1', mas deve ser 'tipo2'.
- CS1688:Não é possível converter bloco de método anónimo sem uma lista de parâmetros para delegar o tipo 'delegate' porque tem um ou mais parâmetros de saída.
- CS1731: Não é possível converter a expressão para delegado uma vez que alguns dos tipos de retorno do bloco não são implicitamente convertíveis para o tipo de retorno do delegado.
- CS1732: Parâmetro esperado.
- CS8030: Função anônima convertida em um delegado de retorno nulo não pode retornar um valor.
- CS8916: Atributos em expressões lambda requerem uma lista de parâmetros entre parênteses.
- CS8934: Não é possível converter um método anónimo para o tipo 'tipo' porque o tipo de retorno não corresponde ao tipo de retorno delegado.
- CS8975: A palavra-chave contextual 'var' não pode ser usada como um tipo de retorno lambda explícito.
- CS9098: Parâmetro lambda digitado implicitamente '...' não pode ter um valor padrão.
Estes erros indicam um problema com um parâmetro de expressão lambda ou declaração de tipo de retorno. Para as regras completas sobre parâmetros lambda e tipos de retorno, veja expressões lambda, métodos anónimos e a secção de expressões de funções anónimas da especificação C#.
Observação
O CS1731 e o CS1732 já não são produzidos pela versão atual do compilador C# (Roslyn). Podem aparecer se estiveres a usar uma versão mais antiga do compilador.
Pode corrigir estes erros utilizando as seguintes orientações:
- Certifique-se de que todos os parâmetros numa expressão lambda usam o mesmo estilo de tipagem. Quando um lambda tem múltiplos parâmetros, cada parâmetro deve ser explicitamente tipado ou implicitamente tipado—não se pode misturar os dois estilos na mesma lista de parâmetros (CS0748).
- Adicione tipos explícitos a qualquer parâmetro lambda que tenha um valor predefinido. O compilador requer tipos explícitos nos parâmetros com valores predefinidos porque deve gerar um tipo de delegado personalizado que codifique o valor predefinido. Parâmetros implicitamente tipados não fornecem informação suficiente para que o compilador construa esse tipo de delegado (CS1065, CS9098).
- Remover valores de parâmetros padrão de métodos anónimos declarados pelo
operador . Os valores de parâmetros padrão são suportados apenas em expressões lambda, não em métodos anónimos. Converta o método anónimo para uma expressão lambda se precisar de valores predefinidos (CS1065). - Faça corresponder os tipos de parâmetros,
ref/out/inmodificadores e a contagem de parâmetros do método lambda ou anónimo ao tipo de delegado de destino. O compilador realiza uma correspondência exata das assinaturas de parâmetros ao converter uma função anónima num delegado: cada parâmetro deve ter o tipo correto, e qualquerref,out, ouinmodificador deve estar presente exatamente quando o delegado o espera (CS1661, CS1676, CS1677,CS1678). - Adicione uma lista de parâmetros ao método anónimo quando o tipo de delegado alvo tiver
outparâmetros. Um método anónimo declarado sem uma lista de parâmetros (usandodelegate { }sintaxe) pode corresponder à maioria dos tipos de delegados, mas o compilador não pode sintetizar implicitamente os parâmetros necessáriosout. Declare os parâmetros explicitamente para corresponderem à assinatura do delegado (CS1688). - Garantir que todos os caminhos de código no método lambda ou anónimo retornam um valor quando o tipo de delegado alvo tem um tipo de retorno não nulo. Cada ramo através do corpo deve produzir um valor de retorno que seja implicitamente convertível para o tipo de retorno do delegado (CS1643, CS1662, CS1731, CS8934).
- Remover qualquer
returninstrução com um valor de um método lambda ou método anónimo atribuído a um tipo de delegado de retorno, comoAction. Como o tipo de retorno do delegate évoid, o corpo não pode retornar um valor (CS8030). - Inclua a lista de parâmetros entre parênteses quando os atributos forem aplicados a qualquer parâmetro lambda. O compilador precisa da forma entre parênteses para distinguir a sintaxe dos atributos de outras expressões. Por exemplo, escrever
([MyAttribute] int x) => xem vez de[MyAttribute] x => x(CS8916). - Use um nome de tipo específico em vez de
var, como o tipo de retorno explícito de uma expressão lambda. A palavra-chavevaré reservada para variáveis locais implicitamente tipadas e não pode ser usada como anotação de tipo lambda return. Especifique o tipo real de retorno, ou omita o tipo de retorno e deixe que o compilador o infira (CS8975). - Corrige a lista de parâmetros para que o compilador a possa reconhecer como uma declaração de parâmetros válida. Este erro indica uma lista de parâmetros mal formada onde o compilador esperava um identificador de parâmetro mas encontrou outra coisa (CS1732).
Tipo de delegado de expressão do Lambda
- CS0407: 'método' tem o tipo de retorno errado.
- CS0428: Não é possível converter o grupo de métodos 'Identificador' para o tipo 'tipo' não delegado. Tinhas intenção de invocar o método?
- CS0467: Aviso: Ambiguidade entre método 'método' e não-método 'não-método'. Usando o grupo de métodos.
- CS0815: Não é possível atribuir 'expressão' a uma variável tipada implicitamente.
- CS0828: Não é possível atribuir 'expressão' à propriedade do tipo anónimo.
- CS1660: Não é possível converter a expressão lambda para o tipo 'tipo' porque não é um tipo delegado.
- CS8917: O tipo de delegado não pôde ser inferido.
- CS8974: Aviso: A converter um grupo de métodos 'método' para o tipo 'tipo' não delegado. Tinha intenção de invocar o método?
- CS9099: Aviso: O valor padrão do parâmetro não corresponde ao tipo de delegado alvo.
- CS9100: Aviso: O parâmetro tem modificador de parâmetros em lambda, mas não no tipo de delegado alvo.
Estes erros indicam um problema com o tipo de delegado que o compilador infere ou espera para uma expressão lambda, método anónimo ou grupo de métodos. Para as regras completas sobre conversões de delegados, veja expressões lambda, métodos anónimos e a secção de expressões funcionais anónimas da especificação C#.
Observação
A versão atual do compilador C# (Roslyn) não produz CS0467. Podes ver este erro se estiveres a usar uma versão mais antiga do compilador.
Pode corrigir estes erros utilizando as seguintes orientações:
- Certifique-se de que o tipo alvo da tarefa ou conversão é um tipo de delegado ou System.Linq.Expressions.Expression. Uma expressão lambda ou método anónimo não pode ser atribuído a um tipo que não seja delegado, como
objectou a uma interface. Altere o tipo da variável para um tipo de delegado compatível comoFunc<>ouAction<>, ou usevarpara deixar o compilador inferir o tipo de delegado (CS1660). - Forneça contexto suficiente para que o compilador determine um único tipo de delegado para a expressão lambda. Quando atribuído a
var, o compilador necessita de um tipo de retorno e uma lista de parâmetros inequívocos. Quando é atribuído a uma propriedade de tipo anónimo, o compilador não consegue inferir um tipo de delegado de forma alguma. Atribui o lambda a uma variável com um tipo de delegado explícito, depois usa essa variável no inicializador de tipos anónimos (CS0815, CS0828, CS8917). - Associe o tipo de retorno do grupo de métodos ao tipo de retorno declarado pelo delegado. Uma conversão de grupo de métodos requer que o tipo de retorno do método seja convertível por identidade ou implicitamente convertível para o tipo de retorno do delegado. Alterar o tipo de retorno do método, ou alterar o tipo de delegado para corresponder (CS0407).
- Invoca o método em vez de atribuir o grupo de métodos quando o tipo de destino não é um delegado. Se o tipo alvo for
string,int, ou outro tipo não delegado, provavelmente pretendia chamar o método e atribuir o seu resultado. Adicione parênteses e argumentos para invocar o método (CS0428, CS8974). - Resolver a ambiguidade entre um método e um membro que não é método, mas que partilham o mesmo nome. Renomeie um dos membros em conflito, ou use uma referência totalmente qualificada para remover a ambiguidade (CS0467).
- Remova o valor padrão do parâmetro ou o
paramsmodificador do lambda quando o tipo de delegado de destino for um tipo padrãoFunc<>ouAction<>. Valores predefinidos eparamsmodificadores fazem com que o compilador gere um tipo de delegado personalizado que não corresponde aFunc<>nem aAction<>. Ou usarvarpara deixar o compilador sintetizar o tipo de delegado correto, ou remover o valor ouparamsmodificador padrão para que a lambda corresponda ao tipo de delegado declarado (CS9099, CS9100).