Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

7.15Выражения анонимных функций

Анонимная функция — это выражение, представляющее собой подставляемое определение метода. Анонимная функция не имеет значения или тип сама по себе, но может быть преобразована в совместимый тип делегата или дерева выражения. Преобразование анонимной функции зависит от целевого типа преобразования. Если это тип делегата, то результатом преобразования является значение делегата, ссылающееся на метод, определяемый анонимной функцией. Если это тип дерева выражения, то результатом преобразования является дерево выражения, которое представляет структуру метода в виде структуры объекта.

По историческим причинам существует две синтаксические разновидности анонимных функций, а именно: лямбда_выражения и выражения_анонимных_методов. Практически для любых целей лямбда_выражения более конкретны и точны, чем выражения_анонимных_методов, которые остаются в языке в целях обратной совместимости.

лямбда_выражение: подпись_анонимной_функции => тело_анонимной_функции

выражение_анонимного_метода: delegate подпись_явной_анонимной_функциинеобязательно блок

сигнатура_анонимной_функции: сигнатура_явной_анонимной_функции сигнатура_неявной_анонимной_функции

подпись_явной_анонимной_функции: ( список_параметров_явной_анонимной_функциинеобязательно )

список_параметров_явной_анонимной_функции: параметр_явной_анонимной_функции список_параметров_явной_анонимной_функции , параметр_явной_анонимной_функции

параметр_явной_анонимной_функции: модификатор_параметра_анонимной_функциинеобязательно тип идентификатор

модификатор_параметра_анонимной_функции: ref out

подпись_неявной_анонимной_функции: ( список_параметров_неявной_анонимной_функциинеобязательно ) параметр_неявной_анонимной_функции

список_параметров_неявной_анонимной_функции: параметр_неявной_анонимной_функции список_параметров_неявной_анонимной_функции , параметр_неявной_анонимной_функции

параметр_неявной_анонимной_функции: идентификатор

тело_анонимной_функции: выражение блок

Оператор => имеет такой же приоритет, как и присваивание (=) и обладает правой ассоциативностью.

Тип параметров анонимной функции в виде лямбда_выражения может задаваться явно или неявно. В списке явно типизированных параметров тип каждого параметра указывается явно. В списке неявно типизированных параметров типы параметров выводятся из контекста, в котором находится анонимная функция, в частности, когда анонимная функция преобразуется в совместимый тип делегата или дерева выражения, типы параметров предоставляются этим типом (§6.5).

В анонимной функции с одним параметром с неявной типизацией в списке параметров можно опустить скобки. Другими словами запись анонимной функции вида

( param ) => выражение

можно сократить до:

param => выражение

Список параметров анонимной функции в виде выражения_анонимного_метода является необязательным. Если они заданы, то параметры должны быть явно типизированы Если они не задаются, то анонимную функцию можно преобразовать в делегат с любым списком параметров, не содержащих параметров out.

Ниже приведены некоторые примеры анонимных функций.

x => x + 1 // Implicitly typed, expression body

x => { return x + 1; } // Implicitly typed, statement body

(int x) => x + 1 // Explicitly typed, expression body

(int x) => { return x + 1; } // Explicitly typed, statement body

(x, y) => x * y // Multiple parameters

() => Console.WriteLine() // No parameters

delegate (int x) { return x + 1; } // Anonymous method expression

delegate { return 1 + 1; } // Parameter list omitted

Поведение лямбда_выражений и выражений_анонимных_методов совпадает за исключением следующих моментов:

  • выражения_анонимных_методов позволяют опускать список параметров целиком, обеспечивая возможность преобразования в типы делегатов с любым списком параметров значения.

  • лямбда_выражения позволяют опускать и выводить типы параметров, тогда как в выражениях_анонимных_методов типы параметров должны быть указаны явно.

  • Тело лямбда_выражения может быть выражением или блоком оператора, тогда как тело выражения_анонимного_метода должно быть блоком оператора.

  • Поскольку тело_выражения могут иметь только лямбда_выражения, выражения_анонимных_методов нельзя преобразовать в тип дерева выражения (§4.6).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]