Параметр ByRef с преобразованием типов - PullRequest
1 голос
/ 19 марта 2012

Я создал класс XDateTime, который может обрабатывать неточные дату и время.

В этом классе есть все операторы CType, необходимые для преобразования в строку и из нее, и он был полностью протестирован в течение последних месяцев.

    Public Shared Widening Operator CType(ByVal xDateTime As FrameworkBL.XDateTime) As String
    Dim retrunValue As String = Nothing

    If xDateTime Is Nothing Then
        retrunValue = Nothing
    Else
        retrunValue = xDateTime.StringValue
    End If

    Return retrunValue
End Operator

Public Shared Narrowing Operator CType(ByVal value As String) As FrameworkBL.XDateTime
    Dim returnValue As FrameworkBL.XDateTime = Nothing


    If String.IsNullOrEmpty(value) Then
        returnValue = Nothing
    Else
        returnValue = New FrameworkBL.XDateTime(value)
    End If

    Return returnValue

End Operator

Однако, когда параметр объекта ByRef возвращает строку, мои операторы CType, похоже, игнорируются и возникает исключение приведения.

    Private Sub Test()
    Dim myXDateTime As FrameworkBL.XDateTime

    myXDateTime = "200101010000007" 'Ok
    Me.Temp1(myXDateTime) 'Ok
    Me.Temp2(myXDateTime) 'Ok
    Me.Temp3(myXDateTime) 'Unable to cast object of type 'System.String' to type 'FrameworkBL.XDateTime'

End Sub

Private Sub Temp1(ByRef myObject As String)
    myObject = "200201010000007"
End Sub

Private Sub Temp2(ByRef myObject As XDateTime)
    myObject = "200301010000007"
End Sub

Private Sub Temp3(ByRef myObject As Object)
    myObject = "200401010000007"
End Sub

Проблема такого рода задокументировано Microsoft , но я не смог найти работающего решения для решения этой проблемы.Я в тупике или есть опция, которая позволила бы мне сохранить мой параметр ByRef Object ??

1 Ответ

0 голосов
/ 19 марта 2012

Решение не в том, чтобы написать этот код.На самом деле, ваш код не должен даже компилироваться и не обращать внимания на ByRef.Вы просто не можете назначить строку для Object, и это правильно.Вы должны включить Option Strict On в настройках вашего проекта.

Это правильное и ожидаемое поведение.

Кроме того, ваши операторские реализации могут (и должны) быть значительно сокращены, если использовать преимуществаоператор VB If.Это исключает избыточную инициализацию и назначения:

Public Shared Widening Operator CType(ByVal xDateTime As XDateTime) As String
    Return If(xDateTime Is Nothing, Nothing, xDateTime.StringValue)
End Operator

То же самое для обратного хода.Тем не менее, я не думаю, что операторы преобразования должны когда-либо работать с Nothing значениями.Это просто заставляет Nothing заползти в код там, где его не должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...