El operador de expresión lambda (=>
) define una expresión lambda
El token =>
se admite de dos formas: como el operador lambda y como un separador de un nombre de miembro y la implementación del miembro en una definición de cuerpo de expresión.
Operador{1}{2}lambda
En las expresiones lambda, el operador=>
{4}lambda {5} separa los parámetros de entrada del lado izquierdo y el cuerpo lambda del lado derecho.
En el ejemplo siguiente se usa la característica LINQ con sintaxis de método para demostrar el uso de las expresiones 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
Los parámetros de entrada de una expresión lambda están fuertemente tipados en tiempo de compilación. Cuando el compilador puede deducir los tipos de los parámetros de entrada, como en el ejemplo anterior, se pueden omitir las declaraciones de tipos. Si tiene que especificar el tipo de los parámetros de entrada, debe hacerlo para cada uno de ellos, como se muestra en el ejemplo siguiente:
int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (int interim, int next) => interim * next);
Console.WriteLine(product); // output: 280
En el ejemplo siguiente se muestra cómo definir una expresión lambda sin parámetros de entrada:
Func<string> greet = () => "Hello, World!";
Console.WriteLine(greet());
Para obtener más información, vea Expresiones lambda.
Definición de cuerpo de expresiones
Una definición de cuerpo de expresión tiene la siguiente sintaxis general:
member => expression;
donde expression
es una expresión válida. El tipo de valor devuelto de expression
se debe poder convertir implícitamente al tipo de valor devuelto del miembro. Si el miembro:
- Tiene un tipo de valor devuelto
void
o - Es un:
- Constructor
- Finalizador
- Descriptor de acceso
set
de propiedad o indizador
expression
debe ser una expresión de instrucción. Dado que el resultado de la expresión se descarta, el tipo de valor devuelto de esa expresión puede ser cualquiera.
En el ejemplo siguiente se muestra una definición de cuerpo de expresión para un método Person.ToString
:
public override string ToString() => $"{fname} {lname}".Trim();
Es una versión abreviada de la definición de método siguiente:
public override string ToString()
{
return $"{fname} {lname}".Trim();
}
Puede crear definiciones de cuerpo de expresiones para métodos, operadores, propiedades de solo lectura, constructores, finalizadores y descriptores de acceso de propiedades e indizadores. Para obtener más información, vea Miembros con forma de expresión.
Posibilidad de sobrecarga del operador
El operador =>
no se puede sobrecargar.
Especificación del lenguaje C#
Para más información sobre el operador lambda, vea la sección Expresiones de función anónima de la Especificación del lenguaje C#.