Il motivo dell'avviso è che all'interno di un ciclo si potrebbe accedere a una variabile che sta cambiando. Tuttavia, la "correzione" in realtà non fa nulla per te in questo contesto non ciclico.
Immaginate di avere un ciclo FOR e il if era al suo interno e la dichiarazione di stringa era esterna. In tal caso, l'errore identifica correttamente il problema di prendere un riferimento a qualcosa di instabile.
Un esempio di ciò che non si vuole:
string acctStatus
foreach(...)
{
acctStatus = account.AccountStatus[...].ToString();
if (!SettableStatuses().Any(status => status == acctStatus))
acctStatus = ACCOUNTSTATUS.Pending.ToString();
}
Il problema è che la chiusura catturerà un riferimento a acctStatus, ma ogni iterazione del ciclo cambierà quel valore. In che caso sarebbe meglio:
foreach(...)
{
string acctStatus = account.AccountStatus[...].ToString();
if (!SettableStatuses().Any(status => status == acctStatus))
acctStatus = ACCOUNTSTATUS.Pending.ToString();
}
Come contesto della variabile è il ciclo, una nuova istanza verrà creato ogni volta perché abbiamo spostato variabile all'interno del contesto locale (il ciclo).
La segnalazione sembra un errore nell'analisi di quel codice da parte di Resharper. Tuttavia, in molti casi questo è un problema valido (come il primo esempio, in cui il riferimento sta cambiando nonostante la sua cattura in una chiusura).
La mia regola generale è, in caso di dubbio, fare un locale.
Ecco un esempio reale mondo mi è stato morso da:
menu.MenuItems.Clear();
HistoryItem[] crumbs = policyTree.Crumbs.GetCrumbs(nodeType);
for (int i = crumbs.Length - 1; i > -1; i--) //Run through items backwards.
{
HistoryItem crumb = crumbs[i];
NodeType type = nodeType; //Local to capture type.
MenuItem menuItem = new MenuItem(crumb.MenuText);
menuItem.Click += (s, e) => NavigateToRecord(crumb.ItemGuid, type);
menu.MenuItems.Add(menuItem);
}
Nota che catturo il tipo NodeType locali, nota nodeType, e HistoryItem crumb.ItemGuid, non briciole [i] .ItemGuid. Ciò garantisce che la mia chiusura non abbia riferimenti a elementi che cambieranno.
Prima di utilizzare i locali, gli eventi si attivavano con i valori correnti, non con i valori catturati che mi aspettavo.
Controllare questo SO Domanda e risposta accettata, potrebbe essere utile. http://stackoverflow.com/questions/235455/access-to-modified-closure – Chuck