The following code makes Resharper to nag with “Access to the modified closure”!
var list = new int[]{1,2,3,4,5}; var listdoubled = new List<int>(); foreach(var item in list) { listdoubled.Add( item * 2 ); } listdoubled.ForEach( n => Console.WriteLn(n) );
The above coed looks absolutely perfect, but why reshaper is so concerned about it? Below is what can go wrong when you access the modified closure.
var list = new int[]{1,2,3,4,5}; var listdoubled = new List<delegate>(); foreach(var item in list) { listdoubled.Add( () => {Console.WriteLn( item * 2 ) ;} ); } listdoubled.ForEach( n => n() );
The first piece of code will print this:
2
4
6
8
10
But the second piece of code will print this:
10
10
10
10
10
Why? Because the variable in the foreach loop is defined once and modified each time. If you change the code like this, you get the correct behavior.
var list = new int[]{1,2,3,4,5}; var listdoubled = new List<delegate>(); foreach(var item in list) { var itemWithNewScope = item; listdoubled.Add( () => {Console.WriteLn( itemWithNewScope * 2 ) ;} ); } listdoubled.ForEach( n => n() );
July 26, 2011 at 6:33 pm
[…] https://qualityofdata.com/2010/12/27/resharper-access-to-the-modified-closure-simplified/ […]