【问题标题】:ByRef parameter with Type Conversion带类型转换的 ByRef 参数
【发布时间】:2012-03-19 18:24:57
【问题描述】:

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

【问题讨论】:

    标签: vb.net type-conversion


    【解决方案1】:

    解决办法是不要写这段代码。事实上,你的代码甚至不应该编译,更不用说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 潜入不应该的代码中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多