2011-01-22 12 views
10
ArrayList x=new ArrayList(); 
x.Add(10); 
x.Add("SS"); 

foreach(string s in x) 
{ 
} 

Significa che quando foreach viene eseguito tenta di eseguire il cast dell'elemento della lista di matrice per digitare l'espressione foreach?Uso di foreach con ArrayList - casting automatico?

+3

Eseguire il codice e vedere. – BoltClock

+0

So cosa fa, ma non sono sicuro che ci sia un casting interno dall'oggetto al tipo specificato. – Lojol

+1

Sfortunatamente 'foreach' lancia implicitamente gli elementi di x al tipo specificato per la variabile di ciclo anche se il cast è normalmente esplicito. Una delle cose brutte che abbiamo ereditato dai tempi pre generici. – CodesInChaos

risposta

10

Sì, se un elemento non è convertibile nel tipo, riceverai un InvalidCastException. Nel tuo caso, non puoi eseguire il cast boxing int a string causando la generazione di un'eccezione.

Essenzialmente, è equivalente a:

foreach (object __o in list) { 
    string s = (string)__o; 
    // loop body 
} 
1

Sì, naturalmente, quando si esegue questo loop e lanci con, il compilatore cercherà di gettare al tipo specificato, che nel tuo caso sarà String . e se non può farlo, genererà InvalidCastException.

8

Secondo C# specification della dichiarazione foreach, il codice è equivalente a

ArrayList x=new ArrayList(); 
x.Add(10); 
x.Add("SS"); 

IEnumerator enumerator = (x).GetEnumerator(); 
try { 
    while (enumerator.MoveNext()) { 
     string element = (string)enumerator.Current; // here is casting occures 
     // loop body; 
    } 
} 
finally { 
    IDisposable disposable = enumerator as System.IDisposable; 
    if (disposable != null) disposable.Dispose(); 
}