Your first example had two different int count
variable declarations (from the separate method calls). Your second example is sharing the same variable declaration.
Your first example would behave the same as the second example had int count
been a field of your main program:
static int count = 0;
static Action GetWorker(int k)
{
return k == 0 ? (Action)(() => Console.WriteLine("Working 1 - {0}",count++))
: (Action)(() => Console.WriteLine("Working 2 - {0}",count++));
}
This outputs:
Working 1 - 0
Working 2 - 1
Working 1 - 2
Working 2 - 3
Working 1 - 4
Working 2 - 5
Working 1 - 6
Working 2 - 7
You can simplify it without the ternary operator as well:
static Action GetWorker(int k)
{
int count = 0;
return (Action)(() => Console.WriteLine("Working {0} - {1}",k,count++));
}
Which outputs:
Working 1 - 0
Working 2 - 0
Working 1 - 1
Working 2 - 1
Working 1 - 2
Working 2 - 2
Working 1 - 3
Working 2 - 3
The main issue is that a local variable declared in a method (in your case int count = 0;
) is unique for that invocation of the method, then when the lambda delegate is created, each one is applying closure around its own unique count
variable:
Action x1 = GetWorker(0); //gets a count
Action x2 = GetWorker(1); //gets a new, different count