C# 为什么是;参考资料;到存储的int(而不是值)的值?

C# 为什么是;参考资料;到存储的int(而不是值)的值?,c#,delegates,C#,Delegates,下面的代码段将输出数字“10”十次: delegate void Printer(); static void Main() { List<Printer> printers = new List<Printer>(); for (int i = 0; i < 10; i++) { printers.Add(delegate { Console.WriteLine(i); }); }

下面的代码段将输出数字“10”十次:

delegate void Printer();

static void Main()
{
      List<Printer> printers = new List<Printer>();
      for (int i = 0; i < 10; i++)
      {
           printers.Add(delegate { Console.WriteLine(i); });
      }

      foreach (var printer in printers)
      {
           printer();
      }
}
委托无效打印机();
静态void Main()
{
列表打印机=新列表();
对于(int i=0;i<10;i++)
{
Add(委托{Console.WriteLine(i);});
}
foreach(打印机中的var打印机)
{
打印机();
}
}
这是因为(摘自):

将委托添加到for循环中,并存储对i的“引用”, 因此,在我们退出循环后 变量i已设置为10,因此当每个委托 调用时,传递给它们的值都是10。“


我的问题是:为什么存储对我的“引用”

这不是按值与按引用的效果

输出为10,因为变量
i
的值是在委托代码运行时计算的,这是在第二个循环中,到那时,将假定值为10,因为第一个循环退出时它的结果就是10

使用调试器逐步完成第二个循环中对
printer()
的调用,您会发现委托闭包在调用时在其原始作用域中取当前值
i

这是因为“委托被添加到for循环中,而对i的“引用”被存储

不,这不是问题所在。问题在于提取委托和引用值的方式。这称为闭包。委托是从循环中提取的,并且只保留
i
的最后一个值,因为闭包是在循环之后运行的。(如果您中途调用它,它将返回该时间的值)

查看代理最终是如何在看似错误的位置编译的

这是它用来演示问题的代码:

Func func1 = null;

Program.<>c__DisplayClass2 class1 = new Program.<>c__DisplayClass2(); // <-- problem

class1.i = 0;

while (class1.i < count)
{
   if (func1 == null) // <-- more problems to follow
   {
      func1 = new Func(class1.<fillFunc>b__0); // <-- yikes: just one func!
   }

   Program.funcArr[class1.i] = func1;
   class1.i++; // <-- and just one i
}
Func func1=null;

Program.c_udisplayClass2 class1=新程序.c_udisplayClass2();//不应为,因为
i
在loop@EpicKip是的。请参阅我在回答中链接的博文。请参阅:&根据C#的较新版本,此问题不再存在?