Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 具有类型转换的ByRef参数_Vb.net_Type Conversion - Fatal编程技术网

Vb.net 具有类型转换的ByRef参数

Vb.net 具有类型转换的ByRef参数,vb.net,type-conversion,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

我确实创建了一个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对象参数返回字符串时,my 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

这种问题很严重,但我找不到解决这个问题的有效方法。我是否处于死胡同,或者是否有一个选项允许我保留ByRef对象参数???

解决方案是不编写此代码。事实上,您的代码甚至不应该编译,更不用说
ByRef
。您无法将字符串分配给
对象
,这是正确的。您应该在项目设置中启用
选项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
值。这只会让
什么都不做
潜入不该潜入的代码中