オブジェクトを別の型にキャストするにはDirectCast演算子を使います。 TryCast演算子を使うと、キャストできなかった場合でも例外をスローせずキャスト結果をNothingにすることができます。

§1 DirectCast演算子

DirectCast演算子はオブジェクトをある型にキャストするための演算子で、DirectCast(変数, キャスト後の型)というように使用します。

Dim s As Stream = ...

' ストリームの型を調べる
If TypeOf s Is MemoryStream Then
  ' ストリームがMemoryStreamだった場合、MemoryStreamにキャストする
  Dim ms As MemoryStream = DirectCast(s, MemoryStream)

  ' MemoryStreamに対する処理を行う
  ms.ToArray()
End If
Sub ControlClicked(ByVal sender As Object, ByVal e As EventArgs)
  ' senderに格納されているオブジェクトの型を調べる
  If TypeOf sender Is Button Then
    ' Buttonにキャストする
    Dim b As Button = DirectCast(sender, Button)
  Else If TypeOf sender Is CheckBox Then
    ' CheckBoxにキャストする
    Dim c As CheckBox = DirectCast(sender, CheckBox)
  End If
End Sub

互換性がない型へのキャスト、例えば継承関係にないクラスへの変換やInteger→Doubleなど異なる型へのキャストを行おうとした場合、例外InvalidCastExceptionがスローされます。

Dim i As Integer = 42

' Integer型の値をObject型に代入
Dim o As Object = i

' Object型に格納されているIntegerの値をDoubleにキャストしようとする
' (実行時にInvalidCastExceptionがスローされる)
Dim d As Double = DirectCast(o, Double)

Integer→Doubleなど異なる型への変換を行いたい場合はDirectCast演算子ではなくCType関数を使います。

DirectCast演算子でキャスト可能かどうかを事前に調べるにはTypeOf演算子を使います。 TypeOf演算子で型チェックを行った結果Trueとなった場合はキャスト可能なので、DirectCast演算子でその型に変換する際に例外がスローされることはありません。



§2 TryCast演算子

TryCast演算子はVB8(VB2005)で導入された演算子で、DirectCast演算子に似たキャストを行うための演算子ですが、DirectCastとは動作が異なります。

DirectCastと同様TryCast(変数, キャスト後の型)というように使用しますが、キャストできない場合でも例外がスローされることはありません。 代わりに、キャストできない場合にはTryCastはNothingを返します。 つまりTryCast演算子はある型へのキャストを試み、キャストできた場合はその型の値、できなかった場合はNothingを返します。

TryCast演算子を使う場合は、キャストできない場合でも例外はスローされないので事前にTypeOf演算子で型チェックを行う必要がなくなります。

Dim s As Stream = ...

' MemoryStreamへのキャストを試みる
Dim ms As MemoryStream = TryCast(s, MemoryStream)

If ms IsNot Nothing Then
  ' キャストできた場合、MemoryStreamに対する処理を行う
  ms.ToArray()
End If

なお、TryCast演算子は参照型にキャストする場合にのみ使用できます。 そのため構造体へのキャストなどには使うことはできません。 また、TryCast演算子はC#におけるas演算子に相当するものです。