То, что лямбда-выражение в выражении содержит результат, не означает, что оно используется. Это хорошо для лямбда-выражения, которое возвращает результат для преобразования в делегат с типом возврата void
, если его тело является действительным выражением оператора . Вот простой пример:
using System;
class Test
{
static int Method() => 5;
static void Main()
{
Action action = () => Method();
}
}
Это нормально, потому что Method()
является допустимым выражением оператора. Он просто вызывает метод и игнорирует результат. Это не будет действительным, потому что 1 + 1
не является допустимым выражением оператора:
// error CS0201: Only assignment, call, increment, decrement,
// await, and new object expressions can be used as a statement
Action action = () => 1 + 2;
Нет такого понятия, как анонимный метод с выражением выражения, поэтому все становится немного проще: вы просто не можете вернуть значение из анонимного метода и преобразовать этот анонимный метод в тип делегата с типом возврата void
.
Соответствующая часть стандарта ECMA C # 5 - 11.7.1:
В частности, анонимная функция F совместима с типом делегата D при условии:
- ...
- Если тело F является выражением, и либо D имеет тип возврата void, либо F асинхронно, а D имеет возврат
Задача типа, тогда, когда каждому параметру F присваивается тип соответствующего параметра в D,
Тело F является допустимым выражением (w.r.t §12), которое будет разрешено как выражение-выражение (§13.7).