【问题标题】:Param changes when passed to query?传递给查询时参数更改?
【发布时间】:2013-12-23 21:34:04
【问题描述】:

我最近从 vb.net 切换到 c# 并不断遇到奇怪的事情。

这让我摸不着头脑,但可能很简单,有人能指出我缺少什么吗?

我有一个 IEnumerable 对象,其中包含实体,目前有 3 个实体。

AAA, orange, blue, red    
BBB, green, yellow, pink    
CCC, orange, pink, red 

使用下面的代码,我似乎得到了最后一个元素的代码(三个字母),只有那个,三遍。所以输出将是:

Running Company code: CCC    
Running Company code: CCC    
Running Company code: CCC  

如果我一步一步通过,它会通过每一个,但我认为它以某种方式在 foreach 循环中更改它,然后将其放入控制台。如果我把 console.writeline 放在循环中,那么我会得到预期的结果。

Running Company code: AAA    
Running Company code: BBB    
Running Company code: CCC  

我没有测试过,但我确信这在 VB.Net 中可以正常工作,有人可以解释我缺少什么,毫无疑问它可能就在我面前。

    public void lookForWork()
    {     

       var custs = _IRepository.GetCustomers();
       var conf = _IRepository.GetConfig(); 

       foreach (var custRow in custs)
       { 

       worker = new BackgroundWorker();
       worker.WorkerSupportsCancellation = true;
       worker.DoWork += (obj, e) => checkWork(conf.Where(x => x.Code == custRow.Code).SingleOrDefault());
       worker.RunWorkerAsync();

       }

    }

    private void checkWork(CustomerConfigEntity custInfo)
    { 
        console.WriteLine(String.Format("Running Company code: {0}", custInfo.Code));
    }

【问题讨论】:

  • 您没有收到有关“不要在 lambda 中使用迭代变量...”或类似内容的警告吗?
  • 不,它运行良好,只是意外输出。

标签: c# c#-4.0


【解决方案1】:

您遇到了“闭包中的 foreach 循环变量”错误。

要么使用 C# 5.0,要么编写:

public void lookForWork()
{     
   var custs = _IRepository.GetCustomers();
   var conf = _IRepository.GetConfig(); 

   foreach (var custRow in custs)
   { 
       var localCustRow = custRow;
       worker = new BackgroundWorker();
       worker.WorkerSupportsCancellation = true;
       worker.DoWork += (obj, e) => 
           checkWork(conf.Where(x => x.Code == localCustRow.Code).SingleOrDefault());
       worker.RunWorkerAsync();
   }
}

有关更多信息,请参阅 Eric Lippert 关于该主题的优秀文章: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

【讨论】:

  • 效果很好,最好的错误总是微软的错误,它们会成为我们的错误!谢谢你,克里斯,尝试投票,但还不能使用此帐户。
猜你喜欢
  • 2017-09-27
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2013-08-02
  • 2017-03-08
相关资源
最近更新 更多