Лямбда-вирази (керівництво з програмування в c #)
Оператор => має такий же пріоритет, як і присвоювання (=), і є правоассоціатівним (див. Розділ "Асоціативність" статті про операторів).
Лямбда-оператори використовуються в запитах LINQ з синтаксисом на основі методів в якості аргументів методів стандартних операторів запиту, таких як Where.
При використанні синтаксису на основі методів для виклику методу Where класу Enumerable (як це відбувається в LINQ to Objects і LINQ to XML) параметром є тип делегата System. Func
Зверніть увагу: в наведеному вище прикладі сигнатура делегата має один неявний вхідний параметр типу int і повертає значення типу int. Лямбда-вираз можна перетворити в делегат відповідного типу, оскільки він також має один вхідний параметр (x) і повертає значення, яке компілятор може неявно перетворити в тип int. (Висновок типів більш детально розглядається в наступних розділах.) Делегат, що викликається за допомогою вхідного параметра 5, повертає результат 25.
Лямбда-вирази не дозволені в лівій частині оператора is або as.
Всі обмеження, що застосовуються до анонімних методів, застосовуються також до лямбда-виразів. Додаткові відомості див. У розділі Анонімні методи (Керівництво з програмування в C #).
Лямбда-вираз з виразом з правої сторони оператора => називається виразом-лямбда. Вирази-лямбда широко використовуються при створенні таких конструкцій як Дерева виразів (C # і Visual Basic). Вирази-лямбда повертають результат виразу і мають наступну основну форму:
Також лямбда-вирази можна використовувати, коли аргумент має тип Expression
Приклад використання стандартного оператора запиту, методу Count. показаний нижче:
Компілятор може вивести тип вхідного параметра; а також його можна визначити явно. Дане конкретне лямбда-вираз підраховує кількість цілих чисел (n), які при діленні на два дають залишок 1.
Наступний рядок коду створює послідовність, яка містить всі елементи масиву numbers. розташовані зліва від 9, оскільки це перше число послідовності, що не задовольняє умові:
Наступні правила застосовні до області дії змінної в лямбда-виразах.
Захоплена змінна не буде знищена збирачем сміття до тих пір, поки делегат, який на неї посилається, не перейде в статус підлягає знищенню при складанні сміття.
Змінна, оголошена в лямбда-виразі, невидима в зовнішньому методі.
Лямбда-вираз не може безпосередньо захоплювати параметри ref або out з методу, в якому вони знаходяться.
Оператор Return в лямбда-виразі не приводить до повернення (завершення) методу, в якому оголошено / викликано лямбда-вираз.
Лямбда-вираз не може містити оператора goto. оператора break або оператора continue всередині лямбда-функції, якщо цільовий об'єкт переходу знаходиться поза блоком. Якщо цільовий об'єкт знаходиться всередині блоку, то наявність оператора переходу за межами лямбда-функції також буде помилкою.