O operador lambda expression (=>) define uma expressão lambda

O token => é suportado de duas formas: como operador lambda e como separador entre o nome do membro e sua implementação em uma definição de corpo de expressão.

A linguagem C# faz referência a documentos da versão mais recentemente lançada da linguagem C#. Ele também contém a documentação inicial para funcionalidades em pré-visualizações públicas para o próximo lançamento do idioma.

A documentação identifica qualquer recurso introduzido pela primeira vez nas três últimas versões do idioma ou nas versões prévias públicas atuais.

Dica

Para descobrir quando um recurso foi introduzido pela primeira vez em C#, consulte o artigo sobre o histórico de versão da linguagem C#.

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 digitados no tempo de compilação. Quando o compilador infere 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á especificar o tipo 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 lambda.

Definição de corpo da expressão

Uma definição do corpo da expressão usa a seguinte sintaxe geral:

member => expression;

Para um membro que retorna um valor, o resultado da expressão deve ser implicitamente conversível para o tipo de retorno do membro. Para um void membro, construtor, finalizador ou set, init, addou remove acessador, o corpo deve ser uma expressão de instrução. Uma expressão de instrução pode ser uma atribuição, invocação de método, criação de objeto, operação de incremento ou decremento ou await expressão. Seu resultado, se houver, é descartado.

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 usar definições do corpo da expressão para os seguintes membros:

  • Métodos e funções locais: Um membro que retorna um valor tem o formulário T M() => expression;. Um void membro tem o formulário void M() => statementExpression;. Para obter mais informações, consulte Métodos e funções locais.
  • Operadores: Um operador tem o formulário public static T operator +(T left, T right) => expression;. Para obter mais informações, consulte Sobrecarga de operador.
  • Propriedades e indexadores: Uma propriedade somente leitura ou indexador tem o formulário T P => expression; ou T this[int i] => expression;. Você também pode usar corpos de expressão para acessadores individuais. Um get acessador tem o formulário get => expression;. Um set ou init acessador tem o formulário set => statementExpression; ou init => statementExpression;. Para obter mais informações, consulte Propriedades e Indexadores.
  • Construtores e finalizadores: Esses membros têm o formulário C() => statementExpression; ou ~C() => statementExpression;. Para obter mais informações, consulte Construtores e Finalizadores.
  • Acessadores de eventos: Um add ou remove acessador tem o formulário add => statementExpression; ou remove => statementExpression;. Para obter mais informações, consulte Eventos.

Sobrecarga do operador

Você não pode sobrecarregar o => operador.

Especificação da linguagem C#

Para obter mais informações sobre o operador lambda, consulte a seção expressões de função anônima da especificação da linguagem C#.

Consulte também