O operador de expressão lambda (=>
) define uma expressão lambda
Há suporte para o token =>
de duas formas: como o operador lambda e como um separador de um nome de membro e a implementação de membro em uma definição de corpo da expressão.
Operador lambda
Em expressões lambda, o operador lambda =>
separa os parâmetros de entrada do lado esquerdo do corpo lambda no lado direito.
O seguinte exemplo usa o recurso LINQ com a sintaxe de método para demonstrar o uso de expressões lambda:
string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
.Where(w => w.StartsWith("a"))
.Min(w => w.Length);
Console.WriteLine(minimalLength); // output: 5
int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (interim, next) => interim * next);
Console.WriteLine(product); // output: 280
Os parâmetros de entrada de uma expressão lambda são fortemente digitados no tempo de compilação. Quando o compilador pode inferir os tipos de parâmetros de entrada, como no exemplo anterior, você pode omitir as declarações de tipo. Caso precise especificar o tipo de parâmetros de entrada, faça isso para cada parâmetro, como mostra o seguinte exemplo:
int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (int interim, int next) => interim * next);
Console.WriteLine(product); // output: 280
O seguinte exemplo mostra como definir uma expressão lambda sem parâmetros de entrada:
Func<string> greet = () => "Hello, World!";
Console.WriteLine(greet());
Para obter mais informações, confira Expressões lambda.
Definição de corpo da expressão
Uma definição de corpo da expressão tem a seguinte sintaxe geral:
member => expression;
em que expression
é uma expressão válida. O tipo de retorno de expression
deve ser implicitamente conversível para o tipo de retorno do membro. Se o membro:
- Tem um tipo de retorno
void
ou - for um:
- Construtor
- Finalizer
- Acessador
set
de propriedade ou indexador
expression
deve ser uma expressão de instrução. Como o resultado da expressão é descartado, o tipo de retorno dessa expressão pode ser qualquer tipo.
O seguinte exemplo mostra uma definição de corpo da expressão para um método Person.ToString
:
public override string ToString() => $"{fname} {lname}".Trim();
É uma versão abreviada da seguinte definição de método:
public override string ToString()
{
return $"{fname} {lname}".Trim();
}
É possível criar definições de corpo da expressão para métodos, operadores, propriedades somente leitura, constructos, finalizadores e acessadores e indexadores de propriedade. Para obter mais informações, consulte Membros aptos para expressão.
Capacidade de sobrecarga do operador
O operador =>
não pode ser sobrecarregado.
Especificação da linguagem C#
Para obter mais informações sobre o operador lambda, confira a seção Expressões de função anônima da Especificação da linguagem C#.