Casting DataTypes with DirectCast, CType, TryCast

TryCast and DirectCast are casting operators that directly map to the CLR’s support for casting. They can quickly cast an object of a base type to a derived type or unbox a value of a value type. DirectCast throws an exception when the cast isn’t possible, TryCast returns Nothing if it failed. You typically want to favor DirectCast to catch programming mistakes.

CType allows a superset of conversions, ones that the CLR frowns on. The best example I can think of is converting a string to a number or date. For example:

Dim obj As Object
obj = "4/1/2010"
Dim dt As DateTime = CType(obj, DateTime)

Which you’ll have to use if Option Strict On is in effect. If it is Off then you can do it directly:

Option Strict Off
...
    Dim dt As DateTime = obj

Very convenient of course and part of VB.NET’s legacy as a dynamically typed language. But not without problems, that date is Unicorn day at stackoverflow.com but will be a day in January when a Briton enters the string. Unexpected conversions is the reason the CLR doesn’t permit these directly. The explicit, never a surprise conversion looks like this:

Dim dt As DateTime = DateTime.Parse(obj.ToString(), _
    System.Globalization.CultureInfo.GetCultureInfo("en-US").DateTimeFormat)

Whether you should buy into Try/DirectCast vs CType vs explicit conversions is rather a personal choice. If you now program with Option Strict On then you should definitely start using Try/DirectCast. If you favor the VB.NET language because you like the convenience of dynamic typing then don’t hesitate to stay on CType.

Leave a Comment