Как мне отбрасывать из Object
в Integer
в VB.NET?
Когда я это сделаю:
Dim intMyInteger as Integer = TryCast(MyObject, Integer)
он говорит:
Оператор TryCast должен быть ссылочным типом, но Integer является типом значения.
Как мне отбрасывать из Object
в Integer
в VB.NET?
Когда я это сделаю:
Dim intMyInteger as Integer = TryCast(MyObject, Integer)
он говорит:
Оператор TryCast должен быть ссылочным типом, но Integer является типом значения.
TryCast
является эквивалентом оператора С# as
. Это оператор "безопасного литья", который не генерирует исключение, если сбой выполняется. Вместо этого он возвращает Nothing
(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
. Подробнее см. документацию MSDN для оператора TypeOf
.
Вы также можете записать его так:
Dim myInt As Integer = If(TypeOf myObj Is Integer, DirectCast(myObj,Integer), 0)
Кроме того, если целое число со значением по умолчанию (например, 0) не подходит, вы можете рассмотреть тип Nullable(Of Integer)
.
Использовать Directcast и catch InvalidCastException
Вы можете использовать это:
Dim intMyInteger as Integer
Integer.TryParse(MyObject, intMyInteger)
Эквивалент для TryCast - CType. Оба будут делать преобразование типов, если это возможно. Напротив, DirectCast преобразует только тип, если он уже такой.
Чтобы проиллюстрировать, вы можете использовать CType, чтобы преобразовать строку, или короткий или двойной, в целое. DirectCast, как правило, дает вам синтаксис/компиляцию, если вы это сделаете; но если вы попытаетесь обойти ошибку, используя тип Object (это называется "бокс" и "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 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 или любой другой статический тип, называемый "нулевым" типом, см. знак вопроса объявления переменной для некоторых больше информации. Но это действительно не делает его "ссылочным" типом.