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

7.15.1Сигнатуры анонимных функций

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

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

Обратите внимание, что сигнатура_анонимной_функции не может включать атрибуты или массив параметров. Тем не менее сигнатура_анонимной_функции может быть совместима с типом делегата, список параметров которого содержит массив параметров.

Обратите внимание, что преобразование в тип дерева выражения, даже если он совместим, может привести к сбою во время компиляции (§4.6).

7.15.2Тела анонимных функций

Тело (выражение или блок) анонимной функции должно удовлетворять следующим правилам.

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

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

  • Если типом this является тип структуры, то при обращении в теле к this возникает ошибка времени выполнения. Это так при явном доступе (как в случае this.x) и при неявном (ср. x, где x является членом экземпляра структуры). Это правило просто запрещает такой доступ и не влияет на то, будет ли при поиске члена найден член структуры.

  • В теле можно обращаться к внешним переменным (§7.15.5) анонимной функции. При доступе к внешней переменной будет сформирована ссылка на экземпляр переменной, активной во время вычисления лямбда_выражения или выражения_анонимного_метода (§7.15.6).

  • При наличии в теле оператора goto, break или continue, назначением которого является расположение вне тела или внутри тела содержащейся анонимной функции, будет возникать ошибка времени компиляции.

  • Оператор return в теле возвращает управление из вызова ближайшей включающей анонимной функции, а не из включающей функции-члена. Выражение, указанное в операторе return, должно быть неявно преобразуемо в возвращаемый тип типа делегата или типа дерева выражений, в который преобразуется ближайшее включающее лямбда_выражение или выражение_анонимного_метода (§6.5).

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

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