Erros e avisos ao usar expressões lambda e funções anônimas
Há vários erros relacionados à declaração e ao uso de expressões lambda:
- CS0748: Utilização inconsistente do parâmetro lambda; todos os tipos de parâmetros devem ser explícitos ou implícitos.
- CS1621: A instrução yield não pode ser usada dentro de um método anônimo ou expressão lambda.
- CS1628: Não é possível usar o parâmetro
in
,ref
ouout
dentro de um método anônimo, expressão lambda ou expressão de consulta. - CS1632: O controle não pode sair do corpo de um método anônimo ou uma 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 dentro “this”.
- CS1686: Variável local ou seus membros não podem ter seu endereço obtido nem ser usado dentro de um método anônimo ou uma 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 para um representante de retorno void não pode retornar um valor.
- CS8175: Não é possível usar a referência local em 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 entre parênteses.
- CS8971: InterpolatedStringHandlerArgument não tem efeito quando aplicado a parâmetros lambda e será ignorado no local de chamada.
- CS8975: A palavra-chave contextual
var
não pode ser usada como um tipo de retorno de lambda explícito. - CS9098: O 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 local de chamada.
- CS9099: O valor do parâmetro padrão não corresponde ao tipo representante de destino.
- CS9100: O parâmetro tem modificador de parâmetros em lambda, mas não no tipo representante de destino.
Limitações de sintaxe em expressões lambda
Algumas sintaxes de C# são proibidas 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 instrução
yield
não pode ser usada dentro de um método anônimo ou expressão lambda. - CS1628: Não é possível usar o parâmetro
in
,ref
ouout
dentro de um método anônimo, expressão lambda ou expressão de consulta. - CS1632: O controle não pode sair do corpo de um método anônimo ou uma 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: Variável local ou seus membros não podem ter seu endereço obtido nem ser usado dentro de um método anônimo ou uma expressão lambda.
- CS8175: Não é possível usar a referência local em um método anônimo, expressão lambda ou expressão de consulta.
Todas as seguintes construções não são permitidas em expressões lambda:
- Instruções
yield
(yield return
ouyield break
) - Chamar um método que tem um parâmetro
in
,ref
ouout
- Variáveis locais
ref
- Instruções
break
,goto
econtinue
- Acesso
this
quandothis
é um tipostruct
- Métodos anônimos ou expressões lambda dentro de outra expressão, como um construtor de Atributo.
Você não pode usar nenhum desses constructos 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 interpoladas 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 a parâmetros lambda e será ignorado no local de chamada.
Parâmetros e retornos da expressão lambda
Estes erros indicam um problema com uma declaração de parâmetro:
- CS0748: Utilização inconsistente do parâmetro lambda; todos os tipos de parâmetros devem ser explícitos ou implícitos.
- CS9098: O parâmetro lambda '...' digitado implicitamente não pode ter um valor padrão.
- CS8030: Função anônima convertida para um representante de retorno void não pode retornar um valor.
- CS8916: Atributos em expressões lambda exigem uma lista de parâmetros entre parênteses.
- CS8975: A palavra-chave contextual 'var' não pode ser usada como um tipo de retorno de 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 eles devem ser explicitamente tipados ou devem ser digitados implicitamente.
- Todos os parâmetros lambda com um valor padrão devem ser explicitamente tipados.
- Se atributos forem aplicados a qualquer parâmetro, a lista de parâmetros deverá ser colocada entre parênteses.
Os tipos de retorno da expressão lambda devem seguir estas regras:
- Uma expressão lambda que retorna qualquer valor não pode ser convertida em um delegado de retorno
void
, comoAction
. - O tipo de retorno é inferido ou um tipo explícito. Um tipo de retorno declarado usando a palavra-chave
var
não é permitido.
Tipo de delegado de expressão lambda
- CS9099: Aviso: O valor do parâmetro padrão não corresponde ao tipo representante de destino.
Quando você declara um valor padrão ou adiciona o modificador params
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 do parâmetro padrão ou o modificador params
. O seguinte código gera avisos porque atribui uma expressão lambda que tem um parâmetro padrão a um tipo Action
:
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 de tipo implícito para o tipo delegado:
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };