Operator wyrażenia lambda (=>) definiuje wyrażenie lambda

Token => jest obsługiwany w dwóch formach: jako operator lambda i jako separator nazwy członka oraz implementacji członka w definicji ciała wyrażenia.

Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.

Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.

Wskazówka

Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.

Operator lambda

W wyrażeniach lambda operator => lambda oddziela parametry wejściowe po lewej stronie od ciała wyrażenia lambda po prawej stronie.

W poniższym przykładzie użyto funkcji LINQ ze składnią metody, aby zademonstrować użycie wyrażeń 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

Parametry wejściowe wyrażenia lambda są silnie typizowane w czasie kompilacji. Gdy kompilator wywnioskuje typy parametrów wejściowych, na przykład w poprzednim przykładzie, można pominąć deklaracje typów. Jeśli musisz określić typ parametrów wejściowych, musisz określić typ dla każdego parametru, jak pokazano w poniższym przykładzie:

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

W poniższym przykładzie pokazano, jak zdefiniować wyrażenie lambda bez parametrów wejściowych:

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

Aby uzyskać więcej informacji, zobacz Wyrażenia lambda.

Definicja treści wyrażenia

Definicja treści wyrażenia używa następującej składni ogólnej:

member => expression;

W przypadku elementu członkowskiego, który zwraca wartość, wynik wyrażenia musi być niejawnie konwertowany na typ zwracany elementu członkowskiego. void W przypadku elementu członkowskiego, konstruktora, finalizatora lub setaddinit, lub remove metody dostępu treść musi być wyrażeniem instrukcji. Wyrażenie instrukcji może być przypisaniem, wywołaniem metody, tworzeniem obiektu, operacją przyrostową lub dekrementacją albo await wyrażeniem. Jego wynik, jeśli istnieje, zostanie odrzucony.

Poniższy przykład pokazuje definicję korpusu wyrażenia dla metody Person.ToString.

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

Jest to skrócona wersja następującej definicji metody:

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

Dla następujących elementów członkowskich można użyć definicji treści wyrażeń:

  • Metody i funkcje lokalne: Element członkowski, który zwraca wartość, ma postać T M() => expression;. Element void członkowski ma formularz void M() => statementExpression;. Aby uzyskać więcej informacji, zobacz Metody i funkcje lokalne.
  • Operatory: Operator ma postać public static T operator +(T left, T right) => expression;. Aby uzyskać więcej informacji, zobacz Przeciążenie operatora.
  • Właściwości i indeksatory: Właściwość lub indeksator tylko do odczytu ma formularz T P => expression; lub T this[int i] => expression;. Można również użyć treści wyrażeń dla poszczególnych metod dostępu. Akcesorium get ma postać get => expression;. Element set lub init akcesor ma postać set => statementExpression; lub init => statementExpression;. Aby uzyskać więcej informacji, zobacz Właściwości i indeksatory.
  • Konstruktory i finalizatory: Te elementy członkowskie mają formularz C() => statementExpression; lub ~C() => statementExpression;. Aby uzyskać więcej informacji, zobacz Konstruktory i finalizatory.
  • Akcesory zdarzeń: Obiekt add lub remove akcesor ma postać add => statementExpression; lub remove => statementExpression;. Aby uzyskać więcej informacji, zobacz Events.

Przeciążenie operatora

Nie można przeciążyć => operatora.

Specyfikacja języka C#

Aby uzyskać więcej informacji na temat operatora lambda, zobacz sekcję Anonimowe wyrażenia funkcjispecyfikacji języka C#.

Zobacz także