Учитывая приведенные ниже примеры, я смущен тем, почему результат для первого примера равен 4, 8, 6, а второй - 4, 8, 3? Для меня в первом примере оцениваются только succ (3) и dub (4), а y должно быть 3? Кто-нибудь может помочь объяснить, как это работает? Большое спасибо!C# отложенная оценка и возвращаемые значения
Пример один:
public class Hello {
public static void Main(string[] args) {
int y = 0;
Func<int,bool> even = (n) => { return n%2 == 0; };
Func<int,int> dub = (n) => { y += 2; return n + n; };
Func<int,int> succ = (n) => { y += 1; return n + 1; };
Func<bool, int, int, int> if1 = (c, t, f) => c? t: f;
y = 0;
var a1 = if1(even(3), dub(3), succ(3));
var a2 = if1(even(4), dub(4), succ(4));
Console.WriteLine("{0} {1} {2}", a1, a2, y);
}
}
Второй пример:
public class Hello {
public static void Main(string[] args) {
int y = 0;
Func<int,bool> even = (n) => { return n%2 == 0; };
Func<int,int> dub = (n) => { y += 2; return n + n; };
Func<int,int> succ = (n) => { y += 1; return n + 1; };
Func<Func<int,bool>, Func<int,int>, Func<int,int>, Func<int,int>> if2 = (c, t, f) => (n) => { if (c(n)) return t(n); else return f(n); };
y = 0;
Func<int,int> x = if2(even, dub, succ);
var c1 = x(3);
var c2 = x(4);
Console.WriteLine("{0} {1} {2}", c1, c2, y);
}
}
Вы пробовали пройти через него с помощью отладчика? Продолжайте нажимать F11, и вы получите ответ :-) – atlaste