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 ou out 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 ou out 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 ou yield break)
  • Chamar um método que tem um parâmetro in, refou out
  • Variáveis locais ref
  • Instruções break, goto e continue
  • Acesso this quando this é um tipo struct
  • 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, como Action.
  • 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) => { };