Il VB ed il C# sono linguaggi simili, ma hanno le loro sottili differenze, vediamo ad esempio i due snippet sottostanti.
Prima di tutto si noti come il Vb non richiede nessun cast per convertire il valore della variabile O di tipo object in un Double, mentre il C# richiede un cast.
Se li si esegue lo snippet VB viene visualizzato "D2 = 34", mentre lo snippet C# genera InvalidCastException. Se qualcuno rimanesse stupito di questo comportamento si consideri che quando A viene messo in O1 c'è un operazione di boxing e quindi L'istruzione (Double) 01 è una operazione di unboxing che chiaramente fallisce dato che tenta di unboxare un Int32 come Double. Se non siete convinti ecco cosa trovate disassemblando l'eseguibile: L_000f: unbox.any float64 se consultate la documentazione della unbox.any vedrete che se il tipo di dato boxato non corrisponde si genera errore. Questo si traduce nella regola d'oro: durante una operazione di unboxing in C# le conversioni implicite non funzionano. L'istruzione corretta è
In questo caso correttamente indichiamo al compilatore di effettuare una operazione di unbox di un Int32, una volta effettuata il compilatore effettua il cast implicito a double, il codice IL ora è il seguente
L_000f: unbox.any int32
L_0014: conv.r8
Come potete vedere la unbox è ora corretta, a seguire ha una conversione a Double. Per finire il discorso qualcuno si potrà chiedere perché in VB funziona tutto senza cast; ecco l'IL generato: L_000f: call float64 [Microsoft.VisualBasic] Microsoft.VisualBasic.CompilerServices.Conversions::ToDouble(object), come potete vedere il vb passa per una funzione particolare che effettua la conversione a double e quindi tratta il valore O come object, naturalmente le performance in questo caso non sono proprio ottimali. Per avere in VB lo stesso comportamento del C# dobbiamo utilizzare un DirectCast a integer, in questo caso anche nell'IL generato da vb troviamo l'opcode unbox.
Spero di non avervi tediato :D
Alk.