我确实创建了一个能够处理不准确日期和时间的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对象参数??
答案 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
蠕变成不应该的代码。