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.
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 Integer
null
/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)
.
Vous pouvez utiliser ceci:
Dim intMyInteger as Integer
Integer.TryParse(MyObject, intMyInteger)
Utilisez Directcast et attrapez InvalidCastException
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".