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.
Há vários erros relacionados à declaração e ao uso de expressões lambda:
- CS0748: Uso inconsistente de parâmetros lambda; os tipos de parâmetros devem ser todos explícitos ou implícitos.
- 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.
- 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'.
- 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: 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 requerem uma lista de parâmetros entre parênteses.
- CS8971: InterpolatedStringHandlerArgument não tem efeito quando aplicado a 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 digitado 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 a parâmetros lambda e será ignorado no site de chamada.
- 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
Algumas sintaxes C# são proibidas em expressões lambda e métodos anónimos. O uso de construções inválidas 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 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.
- 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:
-
yielddeclarações (yield returnouyield break) - Chamando um método que tem um
in,refououtparâmetro -
refvariáveis locais -
break,gotoecontinuedeclarações -
thisacesso quandothisé tipostruct - Métodos anônimos ou expressões lambda dentro de outra expressão, como um construtor Attribute.
Você não pode usar nenhuma dessas construções em uma expressão lambda ou 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, você verá o seguinte aviso:
- CS8971: InterpolatedStringHandlerArgument não tem efeito quando aplicado a parâmetros lambda e será ignorado no site de chamada.
Certas expressões fazem com que o compilador emita o seguinte aviso informativo:
- CS9236: A compilação requer a vinculação da expressão lambda pelo menos um certo número 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 o uso dos 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. A razão é que o compilador deve inferir tipos de parâmetros e argumentos através das expressões lambda e os tipos potenciais levam tempo.
Parâmetros e retornos de expressão do Lambda
Esses erros indicam um problema com uma declaração de parâmetro:
- CS0748: Uso inconsistente de parâmetros lambda; os tipos de parâmetros devem ser todos explícitos ou implícitos.
- CS9098: Parâmetro lambda digitado implicitamente '...' não pode ter um valor padrão.
- 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.
- 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 do Lambda devem seguir estas regras:
- Quando uma expressão lambda tem vários parâmetros, todos os parâmetros devem ser explicitamente digitados ou todos os parâmetros devem ser digitados implicitamente.
- Todos os parâmetros lambda com um valor padrão devem ser explicitamente digitados.
- Se os atributos forem aplicados a quaisquer parâmetros, 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 num
voiddelegado que retorna, comoAction. - O tipo de retorno é ou inferido ou um tipo explícito. Um tipo de retorno declarado usando a palavra-chave
varnão é permitido.
Tipo de delegado de expressão do Lambda
- CS9099: Aviso: O valor do parâmetro padrão não corresponde no tipo de delegado de destino.
Ao declarar um valor padrão ou adicionar o modificador params com um parâmetro de expressão lambda, o tipo de delegado não é um dos tipos Func ou Action. Em vez disso, é um tipo personalizado que inclui o valor padrão de um parâmetro ou um 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 de delegado:
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };