L'operatore lambda expression (=>) definisce un'espressione lambda

Il token => è supportato in due forme: come operatore lambda e come separatore tra il nome di un membro e l'implementazione del membro nella definizione del corpo dell'espressione.

Operatore lambda

Nelle espressioni lambda, l'operatore lambda => separa i parametri di input sul lato sinistro dal corpo dell'espressione lambda sul lato destro.

L'esempio seguente illustra l'utilizzo delle espressioni lambda tramite la funzionalità LINQ con la sintassi dei metodi:

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

I parametri di input di un'espressione lambda sono fortemente tipizzati in fase di compilazione. Se il compilatore è in grado di dedurre i tipi dei parametri di input, come nell'esempio precedente, è possibile omettere le dichiarazioni di tipo. Se il tipo dei parametri di input deve essere specificato, è necessario farlo per ogni parametro, come illustrato nell'esempio seguente:

int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (int interim, int next) => interim * next);
Console.WriteLine(product);   // output: 280

L'esempio seguente illustra come definire un'espressione lambda senza parametri di input:

Func<string> greet = () => "Hello, World!";
Console.WriteLine(greet());

Per altre informazioni, vedere Espressioni lambda.

Definizione del corpo dell'espressione

Una definizione di corpo di espressione presenta la seguente sintassi generale:

member => expression;

dove expression è un'espressione valida. Il tipo restituito di expression deve essere convertibile in modo implicito nel tipo restituito del membro. Se il membro:

  • Ha un tipo restituito void o
  • È di tipo:
    • Costruttore
    • Finalizer
    • Funzione di accesso alla proprietà o all'indicizzatore set

expression deve essere un'espressione di istruzione. Poiché il risultato dell'espressione viene rimosso, il tipo restituito di tale espressione può essere qualsiasi.

L'esempio seguente illustra una definizione del corpo dell'espressione per un metodo Person.ToString:

public override string ToString() => $"{fname} {lname}".Trim();

Si tratta di una versione abbreviata della definizione di metodo seguente:

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}

È possibile creare definizioni del corpo dell'espressione per metodi, operatori, proprietà di sola lettura, costruttori, finalizzatori e funzioni di accesso alle proprietà e agli indicizzatori. Per altre informazioni, vedere Membri con corpo di espressione.

Overload degli operatori

Non è possibile sottoporre a overload l'operatore =>.

Specifiche del linguaggio C#

Per altre informazioni sull’operatore lambda, vedere la sezione Espressioni di funzioni anonime della specifica del linguaggio C#.

Vedi anche