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.
Há vários erros relacionados à declaração e ao uso de expressões lambda:
- CS0748: uso inconsistente de parâmetro lambda; os tipos de parâmetro devem ser todos explícitos ou todos implícitos.
- CS1621: A instruçã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.
- CS1673: métodos anônimos, expressões lambda e expressões de consulta dentro de structs não podem acessar membros da instância '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.
- CS8030: A 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.
- CS8916: atributos em expressões lambda exigem uma lista de parâmetros parênteses.
- CS8971: InterpolatedStringHandlerArgument não tem efeito quando aplicado aos parâmetros lambda e será ignorado no site de chamada.
-
CS8975: A palavra-chave
varcontextual não pode ser usada como um tipo de retorno lambda explícito. - CS9098: parâmetro lambda tipado implicitamente '...' não pode ter um valor padrão.
Além disso, há vários avisos relacionados à declaração e ao uso de expressões lambda:
- CS8971: InterpolatedStringHandlerArgument não tem efeito quando aplicado aos parâmetros lambda e será ignorado no site de chamada.
- CS9099: O valor do parâmetro padrão não corresponde ao tipo de delegado de destino.
- CS9100: o parâmetro tem modificador de params no lambda, mas não no tipo delegado de destino.
O compilador também produz a seguinte mensagem informativa :
- CS9236: A compilação requer a associação da expressão lambda pelo menos o número de vezes especificado. Considere declarar a expressão lambda com tipos de parâmetro explícitos ou, se o método de chamada for genérico, considere usar argumentos de tipo explícitos.
Limitações de sintaxe em expressões lambda
Alguma sintaxe C# é proibida em expressões lambda e métodos anônimos. O uso de constructos inválidos em uma expressão lambda causa os seguintes erros:
-
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 da instância de
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.
- CS8175: Não é possível usar ref local dentro de um método anônimo, expressão lambda ou expressão de consulta.
Todas as construções a seguir não são permitidas em expressões lambda:
-
yieldinstruções (yield returnouyield break) - Chamar um método que tenha um parâmetro
in,ref, ouout -
refvariáveis locais - Instruções
break,gotoecontinue -
thisacesso quandothisé do tipostruct - Métodos anônimos ou expressões lambda dentro de outra expressão, como um construtor de atributos.
Você não pode usar nenhuma dessas construções em uma expressão lambda ou em um método anônimo. Muitos são permitidos em uma função local.
Além disso, os tipos de manipulador de cadeia de caracteres interpolados são ignorados quando aplicados a um parâmetro lambda. Se você usar um, verá o seguinte aviso:
- CS8971: InterpolatedStringHandlerArgument não tem efeito quando aplicado aos parâmetros lambda e será ignorado no site de chamada.
Determinadas expressões fazem com que o compilador emita o seguinte aviso informativo:
- CS9236: A compilação requer a associação da expressão lambda um número mínimo de vezes. Considere declarar a expressão lambda com tipos de parâmetro explícitos ou, se a chamada do método contendo for genérica, considere usar argumentos de tipo explícitos.
A complexidade das expressões lambda e como elas invocam outras expressões lambda está afetando negativamente o desempenho do compilador. O motivo é que o compilador deve inferir tipos de parâmetro e argumento por meio das expressões lambda e os tipos potenciais levam tempo.
Parâmetros de expressão Lambda e retornos
Esses erros indicam um problema com uma declaração de parâmetro:
- CS0748: uso inconsistente de parâmetro lambda; os tipos de parâmetro devem ser todos explícitos ou todos implícitos.
- CS9098: parâmetro lambda tipado implicitamente '...' não pode ter um valor padrão.
- CS8030: A função anônima convertida em um delegado de retorno nulo não pode retornar um valor.
- CS8916: atributos em expressões lambda exigem uma lista de parâmetros parênteses.
- CS8975: A palavra-chave contextual 'var' não pode ser usada como um tipo de retorno lambda explícito.
Os parâmetros de expressão Lambda devem seguir estas regras:
- Quando uma expressão lambda tem vários parâmetros, todos os parâmetros devem ser de tipagem explícita ou todos devem ser de tipagem implícita.
- Todos os parâmetros lambda com um valor padrão devem ser explicitamente tipados.
- Se os atributos forem aplicados a qualquer parâmetro, a lista de parâmetros deverá ser colocada entre parênteses.
Os tipos de retorno de expressão lambda devem seguir estas regras:
- Uma expressão lambda que retorna qualquer valor não pode ser convertida em um
voiddelegado retornado, comoAction. - O tipo de retorno é inferido ou um tipo explícito. Um tipo de retorno declarado usando a palavra-chave
varnão é permitido.
Tipo de delegado para expressão Lambda
- CS9099: Aviso: o valor do parâmetro padrão não corresponde ao tipo de delegado de destino.
Quando você declara um valor padrão ou adiciona o params modificador com um parâmetro de expressão lambda, o tipo delegado não é um dos tipos Func ou Action. Em vez disso, é um tipo personalizado que inclui o valor de parâmetro padrão ou o modificador params. O código a seguir gera avisos porque atribui uma expressão lambda que tem um parâmetro padrão a um Action tipo:
Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };
Para corrigir o erro, remova o parâmetro padrão ou use uma variável digitada implicitamente para o tipo delegado:
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };