オブジェクトを別の型にキャストするにはDirectCast演算子を使います。 TryCast演算子を使うと、キャストできなかった場合でも例外をスローせずキャスト結果をNothingにすることができます。
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演算子でその型に変換する際に例外がスローされることはありません。
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演算子に相当するものです。