Как отличить от Object to Integer в VB.NET?

Как мне отбрасывать из Object в Integer в VB.NET?

Когда я это сделаю:

Dim intMyInteger as Integer = TryCast(MyObject, Integer)

он говорит:

Оператор TryCast должен быть ссылочным типом, но Integer является типом значения.

Ответ 1

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).

Ответ 2

Использовать Directcast и catch InvalidCastException

Ответ 3

Вы можете использовать это:

Dim intMyInteger as Integer

Integer.TryParse(MyObject, intMyInteger)

Ответ 4

Эквивалент для 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 или любой другой статический тип, называемый "нулевым" типом, см. знак вопроса объявления переменной для некоторых больше информации. Но это действительно не делает его "ссылочным" типом.