Prendendo il seguente codice, Resharper mi dice che voicesSoFar
e voicesNeededMaximum
causano "l'accesso a una chiusura modificata". Ho letto di questi, ma quello che mi lascia perplesso è che Resharper suggerisce di risolvere questo problema estraendo le variabili a destra prima della query LINQ. Ma è lì che sono già!Questo codice causa davvero un problema di "accesso alla chiusura modificata"?
Il terminatore si blocca se aggiungo semplicemente int voicesSoFar1 = voicesSoFar
subito dopo int voicesSoFar = 0
. C'è qualche logica strana che non capisco che rende il suggerimento di Resharper corretto? O c'è un modo per "accedere alle chiusure modificate" in sicurezza in casi come questi senza causare bug?
// 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));
Spengo questo avviso di richiamo. Devi certamente stare attento quando modifichi le variabili catturate, ma questo è uno di quei posti in cui una buona conoscenza della lingua supera bruscamente seguendo una regola di tipo meccanico. C'è un motivo per cui C# consente questo: è utile. –