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

6.5Преобразования анонимных функций

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

  • Если функция F содержит подпись_анонимной_функции, тип D и функция F имеют одинаковое число параметров.

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

  • Если функция F содержит список явно введенных параметров, каждый параметр типа D имеет такие же тип и модификаторы, как и соответствующий параметр функции F.

  • Если функция F содержит список неявно введенных параметров, тип D не имеет параметров ref или out.

  • Если тип D имеет тип возвращаемого значения void, а тело функции F представляет собой выражение, каждый параметр которого имеет тип соответствующего параметра D, тело функции F считается допустимым выражением (wrt §7), которое разрешено как выражение_оператора (§8.6).

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

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

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

Тип дерева выражений Expression<D> совместим с анонимной функцией F в том случае, если тип делегата D совместим с F.

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

  • операторы единичного или составного присваивания;

  • динамически привязанное выражение.

В приведенных ниже примерах используется универсальный тип делегата Func<A,R>, который представляет функцию, принимающую аргумент типа A и возвращающую значение типа R:

delegate R Func<A,R>(A arg);

В операциях присваивания

Func<int,int> f1 = x => x + 1; // Ok

Func<int,double> f2 = x => x + 1; // Ok

Func<double,int> f3 = x => x + 1; // Error

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

В результате первой операции присваивания успешно выполняется преобразование анонимной функции к типу делегата Func<int,int>. Поскольку x имеет заданный тип int, x + 1 является допустимым выражением, которое может быть неявно преобразовано к типу int.

Аналогично, в результате второй операции присваивания успешно выполняется преобразование анонимной функции к типу делегата Func<int,double>, поскольку результат выражения x + 1 (тип int) может быть неявно преобразован к типу double.

Однако в результате третьей операции присваивания порождается ошибка времени компиляции. Поскольку x имеет заданный тип double, результат выражения x + 1 (тип double) не может быть неявно преобразован к типу int.

Анонимные функции могут влиять на разрешение перегрузки, а также использоваться при определении типа. Дополнительные сведения см. в §7.5.

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