What is the special case with the foreach/for loop that eliminates bounds checking? Also which bounds checking is it?
See this for details:
http://codebetter.com/blogs/david.hayden/archive/2005/02/27/56104.aspx
Basically, if you have a for loop, and you explicitly refer to IList.Count or Array.Length, the JIT will catch that, and skip the bounds checking. It makes it faster than precomputing the list length.
foreach on a list or array will do the same thing internally, I believe.