我有一个显示错误的linq查询:
如果集合的源是linq查询,我在任何时候尝试访问我正在迭代的变量时都会看到此错误。我想这个错误只是告诉我变量可能会改变,或类似的东西?
答案 0 :(得分:20)
此错误告诉您,查询中的pubConfig
引用将在评估查询时使用pubConfig
的值,而不是您定义它的时间并将其存储在pubConfigSettings
。
实际上,如果“在现场”评估查询,您就可以了。如果你保留它以供以后评估,同时pubConfig
的值发生变化,你会遇到意想不到的结果。
答案 1 :(得分:11)
您正在关闭循环变量considered harmful。查询引用变量,而不是创建查询时变量的值。目前尚不清楚它是否会在您的特定代码示例中导致您出现问题(这取决于您对已创建的查询执行的操作),但通常您应该避免这种情况,因为它可能导致难以调试问题。
一个简单的解决方案是在查询中引用它之前获取循环变量的副本。
foreach (var pubConfig in ...)
{
var pubConfig2 = pubConfig;
// Use pubConfig2 instead of pubConfig in the query.
}
答案 2 :(得分:1)
只要变量在lambda的生命周期内没有被修改就没问题。
如果修改变量并再次使用lambda,则lambda将获得变量的新值,这可能会造成混乱甚至不是线程安全。
要消除警告,您可以在内部作用域中创建一个变量,从外部作用域复制变量并在lambda中使用它。