带有类型转换的ByRef参数

时间:2012-03-19 18:24:58

标签: vb.net type-conversion

我确实创建了一个能够处理不准确日期和时间的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

这类问题是documented by Microsoft,但我找不到解决此问题的有效解决方案。我是死路还是有一个选项可以让我保留我的ByRef对象参数??

1 个答案:

答案 0 :(得分:0)

解决方案不是编写此代码。实际上,您的代码甚至不应该编译,也不要介意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蠕变成不应该的代码。