2012-03-19 76 views
1

我确实创建了一个能够处理不准确的日期和时间的XDateTime类。ByRef参数与类型转换

该类具有转换字符串和字符串所需的所有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运营商似乎被忽略和cast异常。

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 Object参数?

回答

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蠕变到代码不应该。