Następujący kod, Resharper mówi, że voicesSoFar
i voicesNeededMaximum
powodują "dostęp do zmodyfikowanego zamknięcia". Czytałem o tym, ale to, co mnie zastanawia, polega na tym, że Resharper sugeruje naprawienie tego poprzez wyodrębnienie zmiennych tuż przed zapytaniem LINQ. Ale tam już są!Czy ten kod naprawdę powoduje problem "dostęp do zmodyfikowanego zamknięcia"?
Resharper przestaje narzekać, jeśli dodam tylko int voicesSoFar1 = voicesSoFar
zaraz po int voicesSoFar = 0
. Czy jest jakaś dziwna logika, której nie rozumiem, która sprawia, że sugestia Resharpera jest poprawna? Czy istnieje sposób, aby bezpiecznie "uzyskać dostęp do zmodyfikowanych zamknięć" w takich przypadkach, nie powodując błędów?
// 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));
Wyłączam ostrzeżenie o Resharper. Na pewno musisz zachować ostrożność podczas modyfikowania przechwyconych zmiennych, ale jest to jedno z tych miejsc, w których dobre zrozumienie języka wygrywa z regułą. Jest powód, dla którego C# to umożliwia - jest to użyteczne. –