Αντί για
DirectCast((0), Byte))
χρησιμοποίησε
CType(0, System.Byte)
Υπάρχει μια σύγχυση για τη χρήση αυτών των δύο και πολλοί προτιμούν την DirectCast χωρίς να το σκεφτούν δεύτερη φορά απλά και μόνο επειδή είναι πιο γρήγορη. Πότε χρησιμοποιούμε την μία και πότε την άλλη λοιπόν;
Ας πούμε ότι θέλουμε να μετατρέψουμε το string "11111" σε integer (για την ακρίβεια System.Int32). Αν πούμε
Dim s as String = "11111"
Dim x As Integer = CType(s, Integer)
θα πετύχει γιατί κάτι τέτοιο είναι εφικτό (όπως λέει και το MSDN "CType succeeds as long as there is a valid conversion defined between the expression and the type"). Αν όμως πούμε
Dim x As Integer = DirectCast(s, Integer)
θα αποτύχει γιατί όπως διαβάζουμε "DirectCast requires the run-time type of an object variable to be the same as the specified type". Πότε θα συμβεί αυτό; Στην περίπτωση που πούμε:
Dim οbj as Object = "abcdefg"
Dim s As String = DirectCast(obj, String)
Μπορεί το παραπάνω να μοιάζει αρχικά κάπως παράδοξο καθώς έχουμε συνηθίσει να θεωρούμε τον τύπο String ως έναν απλό τύπο αλλά ο λόγος που πετυχαίνει είναι ότι στο .NET, το String κληρονομεί τον τύπο System.Object. Έτσι, η DirectCast δεν κάνει καμία "πραγματική" δουλειά, δεν "επεξεργάζεται" το οbj, απλά βάζει ένα νέο reference σε μια υπάρχουσα περιοχή μνήμης. Όπως φαίνεται, γι αυτόν ακριβώς τον λόγο είναι γρήγορη αλλά κι επικίνδυνη καθώς αν τα περιεχόμενα του obj δεν είναι ήδη στον κατάλληλο τύπο, τότε θα έχουμε run-time error. Επιπρόσθετα, η CType είναι VB.NET specific, δηλαδή χρησιμοποιεί τις βοηθητικές βιβλιοθήκες της VB.NET, ενώ τη DirectCast τη συναντάμε και στη C#. Βέβαια, όταν λέμε "πιο γρήγορη" εννοούμε ότι έχει περίπου διπλάσια ταχύτητα όταν πρόκειται για value types ενώ για reference types είναι λίγο-πολύ το ίδιο.
Τέλος, ρίξε μια ματιά εδώ: http://www.codeproject.com/dotnet/CheatSheetCastingNET.asp για την περίπτωση που χρειαστείς να κάνεις μετατροπές από κώδικα C# σε VB.NET και ο converter δεν τα βγάζει πέρα...
Vir prudens non contra ventum mingit