if(isEven (i)) Console.WriteLine(i + " четное.");
}
}
Вот к какому результату приводит выполнение этой программы.
Использование лямбда-выражения incr:
-10 -8 -6 -4 -2 0
Использование лямбда-выражения isEven:
2 четное.
4 четное.
6 четное.
8 четное.
10 четьюе.
Обратите в данной программе особое внимание на следующие строки объявлений.
Incr incr = count => count +2;
IsEven isEven = n => n % 2 == 0;
В первой строке объявления экземпляру делегата incr присваивается одиночное лямбда-выражение, возвращающее результат увеличения на 2 значения параметраcount.Это выражение может быть присвоено делегатуIncr,поскольку оно совместимо с объявлением данного делегата. Аргумент, указываемый при обращении к экземпляру делегатаincr,передается параметруcount,который и возвращает результат вычисления лямбда-выражения. Во второй строке объявления делегатуisEvenприсваивается выражение, возвращающее логическое значениеtrue,если передаваемый ему аргумент оказывается четным, а иначе — логическое значениеfalse.Следовательно, это лямбда-выражение совместимо с объявлением делегатаIsEven.
В связи со всем изложенным выше возникает резонный вопрос: каким образом компилятору становится известно о типе данных, используемых в лямбда-выражении, например, о типеintпараметраcountв лямбда-выражении, присваиваемом экземпляру делегата incr? Ответить на этот вопрос можно так: компилятор делает заключение о типе параметра и типе результата вычисления выражения по типу делегата. Следовательно, параметры и возвращаемое значение лямбда-выражения должны быть совместимы по типу с параметрами и возвращаемым значением делегата.
Несмотря на всю полезность логического заключения о типе данных, в некоторых случаях приходится явно указывать тип параметра лямбда-выражения. Для этого достаточно ввести конкретное название типа данных. В качестве примера ниже приведен другой способ объявления экземпляра делегатаincr.
Incr incr = (int count) => count + 2;
Как видите,countтеперь явно объявлен как параметр типаint.Обратите также внимание на использование скобок. Теперь они необходимы. (Скобки могут быть опущены только в том случае, если задается лишь один параметр, а его тип явно не указывается.)