Udostępnij za pośrednictwem


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.

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 może wywnioskować 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 to zrobić 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 ma następującą ogólną składnię:

member => expression;

Gdzie expression jest prawidłowym wyrażeniem. Typ zwracany expression musi być możliwy do niejawnej konwersji na typ zwracany elementu członkowskiego. Jeśli członek:

  • Ma typ zwracany void lub
  • Jest:
    • Konstruktor
    • Finalizator
    • Akcesor właściwości lub indeksatora set

expression musi być wyrażeniem. Ponieważ wynik wyrażenia jest odrzucany, zwracany typ tego wyrażenia może być dowolnym typem.

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();
}

Definicje treści wyrażeń można tworzyć dla metod, operatorów, właściwości tylko do odczytu, konstruktorów, finalizatorów oraz metod dostępu do właściwości i indeksatora. Aby uzyskać więcej informacji, zobacz Expression-bodied members (Składowe wyrażeń).

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