18

VB.NETでObjectからにどのようにキャストする必要がありますか?Integer

私がする時:

Dim intMyInteger as Integer = TryCast(MyObject, Integer)

それは言う:

TryCastオペランドは参照型である必要がありますが、整数は値型です。

4

4 に答える 4

33

TryCastC#のas演算子に相当します。これは、キャストが失敗した場合に例外をスローしない「安全なキャスト」演算子です。代わりに、NothingnullC#で)戻ります。Nothing問題は、 (null)(参照型)を(値型)に割り当てることができないことですIntegerInteger 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)型を検討できます。

于 2012-10-31T04:20:19.060 に答える
5

あなたはこれを使うことができます:

Dim intMyInteger as Integer

Integer.TryParse(MyObject, intMyInteger)
于 2014-03-10T11:02:38.587 に答える
3

Directcastを使用して、InvalidCastExceptionをキャッチします

于 2012-10-31T04:21:14.123 に答える
1

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」型と呼ばれるその他の静的型などもあります。詳細については、変数宣言の疑問符を参照しください。しかし、それは実際には「参照」型にもなりません。

于 2013-08-01T16:57:52.233 に答える