On Thu, Jul 5, 2012 at 4:26 PM, Denis Shelomovskij <verylonglogin.reg@gmail.com> wrote:
 
Different situation is for such C# loop:
---
for (int i = 0; i < funcs.Length; ++i)
{
    int t = i;
    funcs[i] = new MyFunc(() => System.Console.WriteLine(t));
}
---
where "t" is local for scope. Here C# behaves correctly, but D doesn't. This D loop
---
foreach(i; 0 .. 5) {
    int t = i;
    functions ~= { printf("%d\n", t); };
}
---
prints "4" five times. It's Issue 2043:
http://d.puremagic.com/issues/show_bug.cgi?id=2043

 
How to distinguish which variables will be copied to the closure context?

I think this is a scope rule, in the previous code, there are three variables:
1. function arguments
2. loop variables
3. local variables
Seems only function parameters is copied. In C#, local variables is copied. There are other rules? And why is the loop variable not local?

Thanks.

Best regards,

-- Li Jie