C# 什么功能<;int,int>;这样做?

C# 什么功能<;int,int>;这样做?,c#,C#,样本1: static void DelegateTest() { Func<int, int> test = null; for(int i=0;i<2;i++) { int y = i; test = (t) => y; } Console.WriteLine(test(1)); // This thing prints 1 //Console.ReadLine(); } static void DelegateTest()

样本1:

static void DelegateTest()
{
  Func<int, int> test = null;
  for(int i=0;i<2;i++)
  {
    int y = i;
    test = (t) => y;
  }
  Console.WriteLine(test(1)); // This thing prints 1
  //Console.ReadLine();
}
static void DelegateTest()
{
Func test=null;
对于(int i=0;i y;
}
Console.WriteLine(test(1));//这个东西打印1
//Console.ReadLine();
}
样本2:

static void DelegateTest2()
{
  Func<int, int> test = null;
  for (int i = 0; i < 2; i++)
  {
    test = (t) => i;
  }
  // This thing prints 2. I want to know why? 
  //Because 'i' gets out of scope when test(1) gets called and it should print 1
  Console.WriteLine(test(1));
  Console.ReadLine();
static void DelegateTest2()
{
Func test=null;
对于(int i=0;i<2;i++)
{
测试=(t)=>i;
}
//这东西印的是2,我想知道为什么?
//因为调用测试(1)时,“i”超出范围,它应该打印1
控制台写入线(测试(1));
Console.ReadLine();

我想知道为什么当我们在范围外调用Func时,它会得到I的增量值?

因为两个循环的
I
的最后一个值都是
2
。在第一个循环中,最后一步不会执行,因为循环条件求值为false,因为
I
变为2。这就是为什么
y
从未分配给
2
的原因>。在第二个代码段中,lambda捕获了
i
的最后一个值,即
2
,这就是它打印2的原因

您正在将
1
传递给您的方法,但这并不重要。即使您传递了不同的值,您仍然会得到相同的结果。这一切都是关于

如果您仍有疑问,并且希望确定
y
i
的最后值是多少,您可以进行另一个简单测试:

int y = 0;
for (int k = 0; k < 2; k++)
{
    y = k;
}
Console.WriteLine(y); // writes 1

int i = 0;
for(; i < 2; i++) { }

Console.WriteLine(i); // writes 2
inty=0;
对于(int k=0;k<2;k++)
{
y=k;
}
Console.WriteLine(y);//写入1
int i=0;
对于(;i<2;i++){}
Console.WriteLine(i);//写入2
在第二个示例中(实际上,在两个示例中),您创建了一个名为的对象。当您将变量用作lambda语句或在lambda/delegate外部定义的匿名委托的一部分时,就会创建一个闭包。此闭包捕获了(关闭)
for
循环中的
i
变量,防止其“超出范围”。在中断循环的条件失败之前,
for
循环必须将该
i
变量最后一次增加一次,使其变为
2
,因此最终得到的是
2
,而不是
1

第一个示例对
y
变量执行相同的操作。您仍然捕获/关闭该变量,并防止其超出范围。但是,
y
变量从未设置为
2
。该示例中的
i
变量仍会增加到
2
,但在此之后,代码不会变为t循环,因此
y
永远不会设置为
2
,这样您仍然可以看到
1
的预期结果


在这两种情况下,传递给该方法的
1
值从未使用过,也没有任何效果。

Pro提示:在这里发布代码图像而不是代码的格式化文本被认为是非常粗鲁的。您的代表级别足够高,您现在应该知道得更清楚了。@JoelCoehoorn对图像感到抱歉。下次我会处理它。来吧,我会的希望您多次知道这是一个重复。我确实理解这一点,但是您的for循环会产生疑问。您已经创建了for循环外的变量,所以它不会超出范围。但是如果您为(int I=0;i@dotnetstep它与(int i=0;i)的
没有什么不同