VB.NET のキャストには CType と DirectCast があります。
これらの違いを理解できていない方も多いようですので紹介したいと思います。
こういうものはすべて MSDN ライブラリ に答えがあります。
DirectCast (microsoft.com) からの引用
型変換の操作を示すキーワードです。次の例で示すように、CType キーワードと同様の方法で使用します。
どちらのキーワードも、1 番目の引数は変換の対象となる式で、2 番目の引数は変換後の型です。式のデータ型と 2 番目の引数で指定されているデータ型の間に変換が定義されていない場合は、どちらの変換も失敗します。
2 つのキーワードの違いは、CType は式と型の間に有効な変換が定義されてさえいれば成功するのに対し、DirectCast はオブジェクト変数のランタイム型が指定された型と同じである必要があります。ただし、指定した型と式のランタイム型が同じ場合、実行時のパフォーマンスは CType より DirectCast の方が優れています。
まあ、DirectCast の方がパフォーマンスが良いということなのですが、以下の場合は DirectCast ですとキャストに失敗するということです。
Dim oHoge As Object = 2.56 ' Object 型に浮動小数を設定
Dim iCType As Integer = CType(oHoge, Integer) ' 成功する
Dim iDirectCast As Integer = DirectCast(oHoge, Integer) ' 失敗する
上の例で、DirectCast は InvalidCastException という例外を Throw します。
一方、CType は、式と型の間の (暗黙的に) 変換が有効であれば成功します。
変換キーワードと共に使用する値は、変換先のデータ型で有効である必要があります。有効でない場合はエラーが発生します。たとえば、長整数型 (Long) を整数型 (Integer) に変換する場合は、その長整数型 (Long) の値が整数型 (Integer) の有効範囲内に含まれている必要があります。
たとえば、浮動小数の場合、暗黙的に整数型へキャストされた後に値の範囲内であれば、CType では成功するということですね。
DirectCast では、型を暗黙的に変換することはない (プログラマが指示した以外の暗黙的なキャストは行わない) ということです。(だから、例外が発生する)
ちなみに、私は CType は使用しないで、DirectCast を使用します。
暗黙的な変換は、バグの温床になると考えているからです。(型は曖昧でないことが望ましいですから)