ByRef参数与类型转换
问题描述:
我确实创建了一个能够处理不准确的日期和时间的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参数?
答
解决方案是不写这段代码。事实上,你的代码甚至不应该编译,并且不要在意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
蠕变到代码不应该。