Partilhar via


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: 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 inref ou out parâ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 var contextual 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.

Limitações de sintaxe em expressões lambda

Algumas sintaxe 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 yield instrução não pode ser usada dentro de um método anônimo ou expressão lambda.
  • CS1628: Não é possível usar in, refou out parâ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:

  • yield declarações (yield return ou yield break)
  • Chamando um método que tem um inref, ou out parâmetro
  • ref variáveis locais
  • break, goto, e continue declarações
  • this Acesso quando this é um struct tipo
  • 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.

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 em um void representante que retorna, 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 do Lambda

  • CS9099: Aviso: O valor do parâmetro padrão não corresponde no 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 de delegado não é um dos Func tipos ou Action . Em vez disso, é um tipo personalizado que inclui o valor do parâmetro padrão ou params modificador. 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) => { };