web-dev-qa-db-fra.com

Comment convertir un objet en un entier dans VB.NET?

Comment devrais-je convertir d'une Object à une Integer dans VB.NET?

Quand je fais:

Dim intMyInteger as Integer = TryCast(MyObject, Integer)

ça dit:

L'opérande TryCast doit être du type référence, mais Integer est un type valeur.

13
CJ7

TryCast est l'équivalent de l'opérateur as de C #. Il s'agit d'un opérateur de "distribution sécurisée" qui ne lève pas d'exception si la distribution échoue. Au lieu de cela, il retourne Nothing (null en C #). Le problème est que vous ne pouvez pas affecter Nothing (null) (un type de référence) à un Integer (un type de valeur). Il n'existe pas de variable Integernull/Nothing.

Au lieu de cela, vous pouvez utiliser TypeOf et Is:

If TypeOf MyObject Is Integer Then
    intMyInteger = DirectCast(MyObject, Integer)
Else
    intMyInteger = 0
End If

Ceci teste pour voir si le type runtime de MyObject est Integer. Consultez la documentation MSDN sur l'opérateur TypeOf pour plus de détails.

Vous pouvez aussi l'écrire comme ceci:

Dim myInt As Integer = If(TypeOf myObj Is Integer, DirectCast(myObj,Integer), 0)

De plus, si un entier avec une valeur par défaut (comme 0) ne convient pas, vous pouvez envisager un type Nullable(Of Integer).

28
Jonathon Reinhart

Vous pouvez utiliser ceci:

Dim intMyInteger as Integer

Integer.TryParse(MyObject, intMyInteger)
3
CoOl

Utilisez Directcast et attrapez InvalidCastException

3
Swordblaster

L'équivalent pour TryCast estCType. Les deux vont faire une conversion de type si c'est possible. En revanche,DirectCastne convertira le type que s'il est déjà ce type.

Pour illustrer cela, vous pouvez utiliser CType pour convertir une chaîne, ou une courte, ou une double, en un entier. DirectCast vous donnera généralement une erreur de syntaxe/compilation si vous le faites; mais si vous essayez de contourner l'erreur en utilisant le type Object (appelé "boxing" et "unboxing"), une exception sera lancée au moment de l'exécution.

    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

Cela produira:

    CType converted to: 1 (type: System.Int32)
    DirectCast threw exception

Donc, pour suivre de plus près la TryCast sémantique, je suggère d'utiliser une fonction comme celle-ci:

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

Et pour illustrer son effet:

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

L'exécution de TestTryCastInteger () produira:

    TryCastInteger converted to: 1 (type: System.Int32)
    Could not convert to Integer

Là aussi est une chose telle qu'un null/Nothing Integer, ou tout autre type statique, appelé un type "nullable", voir Variable statement mark mark pour plus d'informations. Mais cela n'en fait pas vraiment un type "de référence".

1
Abacus