Когда вы создаете делегата, любая переменная вне его области действия захватывается.В этом случае делегаты, назначенные d1
и d2
, захватывают переменную j
, объявленную внутри testMethod()
;они не создают копии j
, они фиксируют фактическую переменную.В этом смысле, в течение времени жизни d1
и d2
, j
ведет себя внутри них, как если бы это была глобальная переменная (хотя, конечно, в C # такой вещи нет как глобальной переменной).
Если вы хотите, чтобы эти методы получали отдельные экземпляры j
, вам нужно будет предоставить каждому методу копию j
вместо того, чтобы просто использовать ее.Например:
public void testMethod(int input)
{
int j = 0;
int k = j;
d1 = () => { j = 10; return j < input; };
d2 = (x) => { return x == k; };
System.Console.WriteLine("j = {0}", j);
bool res = d1();
System.Console.WriteLine("res={0}, j ={1}", res, j);
}