VB.NETでObject
からInteger
にキャストするにはどうすればよいですか?
私がする時:
Dim intMyInteger as Integer = TryCast(MyObject, Integer)
それは言う:
TryCastオペランドは参照型でなければなりませんが、Integerは値型です。
TryCast
は、C#のas
演算子と同等です。これは、キャストが失敗した場合に例外をスローしない「安全なキャスト」演算子です。代わりに、Nothing
(C#ではnull
)を返します。問題は、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
であるかどうかをテストします。詳細については、 TypeOf
演算子に関するMSDNドキュメント を参照してください。
次のように書くこともできます:
_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を使用して、文字列、またはShort、またはDoubleを整数に変換できます。 DirectCastを実行すると、通常、構文/コンパイルエラーが発生します。しかし、Objectタイプ(これは「ボックス化」および「ボックス化解除」と呼ばれます)を使用してエラーを回避しようとすると、実行時に例外がスローされます。
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
また、isnull/Nothing Integer、または「nullable」タイプと呼ばれるその他の静的タイプなどがあります。詳細については、変数宣言の疑問符を参照してください。しかし、それでも実際には「参照」型にはなりません。