以下面的代碼,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#允許這樣做是有原因的 - 這很有用。 – 2010-02-11 05:59:10