VB.NETでObject
からにどのようにキャストする必要がありますか?Integer
私がする時:
Dim intMyInteger as Integer = TryCast(MyObject, Integer)
それは言う:
TryCastオペランドは参照型である必要がありますが、整数は値型です。
TryCast
C#のas
演算子に相当します。これは、キャストが失敗した場合に例外をスローしない「安全なキャスト」演算子です。代わりに、Nothing
(null
C#で)戻ります。Nothing
問題は、 (null
)(参照型)を(値型)に割り当てることができないことですInteger
。Integer
null
/のようなものはありませんNothing
。
TypeOf
代わりに、とを使用できますIs
:
If TypeOf MyObject Is Integer Then
intMyInteger = DirectCast(MyObject, Integer)
Else
intMyInteger = 0
End If
これは、のランタイムタイプがでMyObject
あるかどうかを確認するためにテストしますInteger
。詳細については、オペレーターに関するMSDNドキュメントをTypeOf
参照してください。
次のように書くこともできます。
Dim myInt As Integer = If(TypeOf myObj Is Integer, DirectCast(myObj,Integer), 0)
さらに、デフォルト値(0など)の整数が適切でない場合は、Nullable(Of Integer)
型を検討できます。
あなたはこれを使うことができます:
Dim intMyInteger as Integer
Integer.TryParse(MyObject, intMyInteger)
Directcastを使用して、InvalidCastExceptionをキャッチします
TryCastに相当するのはCTypeです。可能であれば、両方とも型変換を行います。対照的に、DirectCastは、そのタイプがすでにそのタイプである場合にのみ、そのタイプを変換します。
説明のために、CTypeを使用して、String、Short、またはDoubleを整数に変換できます。DirectCastを実行すると、通常、構文/コンパイルエラーが発生します。ただし、タイプObject(これは「boxing」および「unboxing」と呼ばれます)を使用してエラーを回避しようとすると、実行時に例外がスローされます。
Dim OnePointTwo As Object = "1.2"
Try
Dim temp = CType(OnePointTwo, Integer)
Console.WriteLine("CType converted to: " & temp.ToString & " (type: " & temp.GetType.ToString & ")")
Catch ex As Exception
Console.WriteLine("CType threw exception")
End Try
Try
Dim temp = DirectCast(OnePointTwo, Integer)
Console.WriteLine("DirectCast converted to: " & temp.ToString & " (type: " & temp.GetType.ToString & ")")
Catch ex As Exception
Console.WriteLine("DirectCast threw exception")
End Try
これは出力します:
CType converted to: 1 (type: System.Int32)
DirectCast threw exception
したがって、 TryCastのセマンティクスに最も厳密に従うには、次のような関数を使用することをお勧めします。
Shared Function TryCastInteger(value As Object) As Integer?
Try
If IsNumeric(value) Then
Return CType(value, Integer)
Else
Return Nothing
End If
Catch ex As Exception
Return Nothing
End Try
End Function
そしてその効果を説明するために:
Shared Sub TestTryCastInteger()
Dim temp As Integer?
Dim OnePointTwo As Object = "1.2"
temp = TryCastInteger(OnePointTwo)
If temp Is Nothing Then
Console.WriteLine("Could not convert to Integer")
Else
Console.WriteLine("TryCastInteger converted to: " & temp.ToString & " (type: " & temp.GetType.ToString & ")")
End If
Dim NotANumber As Object = "bob's your uncle"
temp = TryCastInteger(NotANumber)
If temp Is Nothing Then
Console.WriteLine("Could not convert to Integer")
Else
Console.WriteLine("TryCastInteger converted to: " & temp.ToString & " (type: " & temp.GetType.ToString & ")")
End If
End Sub
TestTryCastInteger()を実行すると、次のように出力されます。
TryCastInteger converted to: 1 (type: System.Int32)
Could not convert to Integer
null / Nothing Integerや、「nullable」型と呼ばれるその他の静的型などもあります。詳細については、変数宣言の疑問符を参照してください。しかし、それは実際には「参照」型にもなりません。