【发布时间】:2010-02-11 04:58:37
【问题描述】:
使用以下代码,Resharper 告诉我 voicesSoFar 和 voicesNeededMaximum 导致“访问修改后的闭包”。我读到了这些,但令我困惑的是,Resharper 建议通过在 LINQ 查询之前提取变量来解决这个问题。但他们已经在那儿了!
如果我只是在int voicesSoFar = 0 之后添加int voicesSoFar1 = voicesSoFar,Resharper 就会停止抱怨。是否有一些我不明白的奇怪逻辑使 Resharper 的建议正确?或者有没有办法在这种情况下安全地“访问修改后的闭包”而不会导致错误?
// this takes voters while we have less than 300 voices
int voicesSoFar = 0;
int voicesNeededMaximum = 300;
var eligibleVoters =
voters.TakeWhile((p => (voicesSoFar += p.Voices) < voicesNeededMaximum));
【问题讨论】:
-
我关闭了这个 Resharper 警告。在修改捕获的变量时您当然必须小心,但这是对语言的良好理解胜过遵循死记硬背规则的地方之一。 C# 允许这样做是有原因的——它很有用。