resharper让我把它变成一个局部变量,写下“访问修改后的闭包”
if (filter != null)
{
if (filter.CityId != 0)
{
ads = ads.Where(x => x.Ad.CityId == filter.CityId);
}
if (filter.BusinesCategoryId != 0)
{
ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId);
}
}
为什么局部变量过滤?
答案 0 :(得分:6)
因为您的查询(Where(...))未被执行。我假设过滤器是从循环中获得的?
Linq查询在使用之前不会执行。因此,如果您通过一堆过滤器循环然后开始执行它们,则查询中的过滤器值将是错误的。
一个类似的问题:Access to Modified Closure 另外:http://devnet.jetbrains.net/thread/273042
需要看到更多代码才能100%确定。
答案 1 :(得分:3)
根据我的理解,如果从委托(闭包)访问变量,Resharper将抛出错误,然后在执行委托之前修改变量。如果您在委托/ lambda中访问for循环变量并在循环外执行它,则会发生这种情况。如果您的代码如下:
foreach (filter in filters)
{
if (filter != null) {
if (filter.CityId != 0) {
ads = ads.Where(x => x.Ad.CityId == filter.CityId);
}
if (filter.BusinesCategoryId != 0) {
ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId);
}
}
}
return ads.ToList()
然后它不会表现得像你期望的那样。但是如果你在循环范围内执行lambda表达式,那么你就没有问题了。
我不会解释为什么它会这样,因为很多人已经很好地解释了它:
更新: 回答“为什么选择局部变量?”是因为对上述问题的修复是使用局部变量(即在循环内部)并在lambda中使用它。这样你就可以为lambda的每个实例关闭变量的不同实例。