O operador Lambda expression (=>
) define uma expressão lambda
O =>
token é suportado de duas formas: como operador lambda e como separador de um nome de membro e a implementação de membro em uma definição de corpo de expressão.
Operador Lambda
Em expressões lambda, o operador =>
lambda separa os parâmetros de entrada no lado esquerdo do corpo lambda no lado direito.
O exemplo a seguir usa o recurso LINQ com 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 tipados em tempo de compilação. Quando o compilador pode inferir os tipos de parâmetros de entrada, como no exemplo anterior, você pode omitir declarações de tipo. Se você precisar especificar o tipo de parâmetros de entrada, deverá fazer isso para cada parâmetro, como mostra o exemplo a seguir:
int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (int interim, int next) => interim * next);
Console.WriteLine(product); // output: 280
O exemplo a seguir 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, consulte Expressões do Lambda.
Definição do corpo da expressão
Uma definição de corpo de expressão tem a seguinte sintaxe geral:
member => expression;
onde expression
é uma expressão válida. O tipo de retorno deve ser implicitamente conversível para o tipo de retorno do expression
membro. Se o membro:
- Tem um tipo de
void
retorno ou - É um:
- Construtor
- Finalizador
- Acessador de propriedade ou indexador
set
expression
deve ser uma expressão de declaração. Como o resultado da expressão é descartado, o tipo de retorno dessa expressão pode ser qualquer tipo.
O exemplo a seguir mostra uma definição de corpo de expressão para um Person.ToString
método:
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();
}
Você pode criar definições de corpo de expressão para métodos, operadores, propriedades somente leitura, construtores, finalizadores e acessadores de propriedade e indexador. Para obter mais informações, consulte Membros com corpo de 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, consulte a seção Expressões de função anônimas da especificação da linguagem C#.