gpt4 book ai didi

c# - 访问修改后的闭包,这是 ReSharper 错误吗?

转载 作者:太空宇宙 更新时间:2023-11-03 20:41:11 25 4
gpt4 key购买 nike

我有最新的 ReSharper 5.0 版本 (1655),我在下面的代码中遇到了“访问修改后的闭包”的建议:

var now = new DateTime(1970, 1, 1);
var dates = new List<DateTime>();
dates.Where(d => d > now);
...
now = new DateTime();

lambda 表达式中的 now 带有警告下划线。

我很确定这是 ReSharper 的一个错误,但这是真的吗?

编辑:我应该检查得更好,在代码的后面有一个分配给 now

编辑 2 Jon Skeet 的 answer下面几乎回答了这个问题,但是以下内容呢:

var query = dates.Where(d => d > now).ToList();

这不应该通过立即执行查询来解决问题吗?

最佳答案

是的,现在您已经修改了问题,这完全有道理。您正在修改闭包中使用的变量 - 这可能会产生意外结果:

var now = new DateTime(1970, 1, 1);
var dates = new List<DateTime>();
var query = dates.Where(d => d > now);
...
now = new DateTime(1990, 1, 1);
foreach (DateTime date in query)
{
// This will only see dates after 1990, not after 1970
// This would confuse many developers.
}

事实上,这不仅仅是查询何时开始的问题 - 您可以在遍历结果时修改它:

var now = new DateTime(1970, 1, 1);
var dates = new List<DateTime>();
var query = dates.Where(d => d > now);
...
foreach (DateTime date in query)
{
now = date;
Console.WriteLine(date);
}

这将给出一个严格递增的日期序列……同样,有点令人困惑。

R# 对此发出警告是绝对正确的,IMO。它有时很有用 - 但应谨慎使用。

关于c# - 访问修改后的闭包,这是 ReSharper 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2591677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com