2015-09-22 2 views
2

Я изучаю Java уже довольно давно, но только начал изучать C#. Я действительно пытаюсь понять, как нижеприведенная программа дает ответ 101. Если кто-нибудь сможет пройти через меня, это будет здорово.Проблема с пониманием выражения C# лямбда

void Main() { 
var x = F(n => n+1, n => n*n)(10); 
Console.WriteLine("{0}", x); 
} 

public Func<int,int> F (Func<int,int>p, Func<int,int>q) { 
return x => p(q(x)); 
} 
+1

конкретно, с чем вы столкнулись? –

+0

Практически все ... Я не вижу, как программа получает ответ 101 – M0rty

+6

Есть две функции, передаваемые 'F' -' p' & 'q'. 'q' применяется сначала к' x' и 'p' применяется к результату этого. Так как 'x == 10', у вас есть' 10 * 10', а затем '100 + 1'. – Enigmativity

ответ

4

Во-первых, тип Func<T,U> является тип делегата для функции с одним входом типа T и выходом типа U. Таким образом, в этом примере функция F принимает два входа: p - это функция, которая принимает целое число как входной сигнал и возвращает целое число как результат, равно q. Функция F также возвращает объект Func<int, int>. Функция, возвращаемая F, - это тот, который сначала вызывает q, а затем вызывает p с выходом q, переданным в p.

В Main, функция, которая добавляет один (n => n + 1) передается в качестве значения p и квадратной функции (n => n * n) передается в течение q. Это означает, что F возвращает новую функцию, которая принимает свой вход, квадратично (выполняет операцию q), а затем добавляет ее (выполняет операцию p).

И наконец, 10 поставляется в качестве аргумента для этой функции, поэтому результат 10*10 + 1 = 101.

Смежные вопросы