Jon Jagger
jon@jaggersoft.com
Table of Contents 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Notes DownloadECMA-334 C# Language Specificationpreviousnextprevious at this levelnext at this level 15 Statementsprevious at this levelnext at this level 15.8 Iteration statementsprevious at this levelnext at this level 15.8.4 The foreach statement Paragraph 11 The foreach statement enumerates the elements of a collection, executing an embedded statement for each element of the collection. foreach-statement : foreach ( type identifier in expression ) embedded-statement Paragraph 21 The type and identifier of a foreach statement declare the iteration variable of the statement. 2 The iteration variable corresponds to a read-only local variable with a scope that extends over the embedded statement. 3 During execution of a foreach statement, the iteration variable represents the collection element for which an iteration is currently being performed. 4 A compile-time error occurs if the embedded statement attempts to modify the iteration variable (via assignment or the ++ and --operators) or pass the iteration variable as a ref or out parameter. Paragraph 31 The type of the expression of a foreach statement must be a collection type (as defined below), and an explicit conversion (§13.2) must exist from the element type of the collection to the type of the iteration variable. 2 If expression has the value null, a System.NullReferenceException is thrown. Paragraph 41 A type C is said to be a collection type if it implements the System.IEnumerable interface or implements the collection pattern by meeting all of the following criteria: Paragraph 51 A type that implements IEnumerable is also a collection type, even if it doesn't satisfy the conditions above. 2 (This is possible if it implements IEnumerable via private interface implementation.) Paragraph 61 The System.Array type (§19.1.1) is a collection type, and since all array types derive from System.Array, any array type expression is permitted in a foreach statement. 2 The order in which foreach traverses the elements of an array is as follows: For single-dimensional arrays elements are traversed in increasing index order, starting with index 0 and ending with index Length -1. 3 For multi-dimensional arrays, elements are traversed such that the indices of the rightmost dimension are increased first, then the next left dimension, and so on to the left. Paragraph 71 A foreach statement of the form:
foreach (ElementType element in collection) statement  
corresponds to one of two possible expansions:
[Note: Significant optimizations of the above are often easily available. If the type E implements System.IDisposable, then the expression (enumerator as System.IDisposable) will always be non-null and the implementation can safely substitute a simple conversion for a possibly more expensive type test. Conversely, if the type E is sealed and does not implement System.IDisposable, then the expression (enumerator as System.IDisposable) will always evaluate to null. In this case, the implementation can safely optimize away the entire finally clause. end note] 4 In either expansion, the enumerator variable is a temporary variable that is inaccessible in, and invisible to, the embedded statement, and the element variable is read-only in the embedded statement. [Example: The following example prints out each value in a two-dimensional array, in element order:
using System;  
class Test  
{  
   static void Main() {  
      double[,] values = {  
         {1.2, 2.3, 3.4, 4.5},  
         {5.6, 6.7, 7.8, 8.9}  
      };  
      
      foreach (double elementValue in values)  
      Console.Write("{0} ", elementValue);  
      Console.WriteLine();  
   }  
}  
The output produced is as follows:
1.2 2.3 3.4 4.5 5.6 6.7 7.8 8.9  
end example]
{ JSL }
Jagger Software Ltd
Company # 4070126
VAT # 762 5213 42
Valid HTML 4.01Valid CSS