2012-03-19 11 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演算子は無視され、キャストExceptionが発生します。

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

解決策はこのコードを書くことではありません。実際には、あなたのコードはコンパイルすべきではなく、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がコードに入ることがないようになります。