web-dev-qa-db-ja.com

VB.NETでオブジェクトから整数にキャストする方法は?

VB.NETでObjectからIntegerにキャストするにはどうすればよいですか?

私がする時:

Dim intMyInteger as Integer = TryCast(MyObject, Integer)

それは言う:

TryCastオペランドは参照型でなければなりませんが、Integerは値型です。

14
CJ7

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

29

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

Dim intMyInteger as Integer

Integer.TryParse(MyObject, intMyInteger)
4
CoOl

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

3
Swordblaster

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

1
Abacus