2015-12-18 57 views
2

我可以在盒裝內置類型上成功使用CStr()。但我如何才能實現與盒裝自定義類型相同?我越來越如何使CStr()處理盒裝自定義數據類型?

Exception thrown: 'System.InvalidCastException' in Microsoft.VisualBasic.dll 

的codez:

' sample custom type 
Structure Record 
    Public Property Value As Integer 
    Overloads Function TOSTRING() As String ' capitalizaition intentional to reveal usage 
     Return ">>" & Value.ToString() & "<<" 
    End Function 
    Shared Operator &(left As String, right As Record) As String 
     Return left & right.TOSTRING() 
    End Operator 
    Shared Widening Operator CType(left As Record) As String 
     Return left.TOSTRING() 
    End Operator 
End Structure 

' both use cases 
Sub Main() 
    ' demo with built-in type 
    Dim i As Integer = 3 
    Dim ib As Object = i ' boxed into Object 
    Debug.Print("i:" & CStr(i)) 
    Debug.Print("ib:" & CStr(ib)) ' works OK 

    ' demo with custom type 
    Dim r As New Record With {.Value = 3} 
    Dim rb As Object = r ' boxed into Object 
    Debug.Print("r:" & CStr(r)) 
    Debug.Print("rb:" & CStr(rb)) ' Exception thrown: 
            ' 'System.InvalidCastException' in Microsoft.VisualBasic.dll 
End Sub 
+0

改用'.ToString()'。 –

+0

@RezaAghaei - 不會無縫處理空值。相反,我想讓我的類型看起來像運行時的​​「本地」。也許我只是錯過了一些明顯的東西。 – miroxlav

+0

如果您不想處理空值,請使用'Convert.ToString(rb)'。 –

回答

1

您可以覆蓋ToString這樣:

Public Overrides Function ToString() As String 
    'Put the logic here 
    Return ">>" & Value.ToString() & "<<" 
End 

然後用Convert.ToString()方法將對象轉換爲字符串。

實施例:

Dim r As New Record With {.Value = 3} 
Dim rb As Object = r ' boxed into Object 
MessageBox.Show("rb:" & Convert.ToString(rb)) 'Shows >>3<< 
+0

是的,技術上是正確的。但是自定義數據類型會不會像'CStr()一樣使用本地類型呢? – miroxlav

+0

不幸的是,在'VB6'之後我並沒有使用'CStr',而且我總是使用'.Net'方法'ToString'方法。 –

+0

好的,我接受了這個答案。如果有人發現如何讓CStr(rb)工作,也許我會在將來標記另一個。 – miroxlav

0

的最佳方式是覆蓋在.ToString用戶類型。我相信Cstr()CBool()和更多仍然存在的向後兼容性。 (VB6)

在您的類型中覆蓋.ToString的另一個好處是,在調試時,當您觀察類型的引用變量時,對象的類型不僅僅是對象的類型,而是更有意義的信息。

相關問題