【发布时间】:2016-03-24 18:28:49
【问题描述】:
我可以在盒装内置vb.net 类型上成功使用CStr()。但是我怎样才能用盒装的自定义类型实现同样的效果呢?我来了
Exception thrown: 'System.InvalidCastException' in Microsoft.VisualBasic.dll
密码:
' 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
【问题讨论】:
-
改用
.ToString()。 -
@RezaAghaei - 不会无缝处理空值。相反,我想让我的类型在运行时看起来“原生”。也许我只是错过了一些明显的东西。
-
如果您不想处理空值,请使用
Convert.ToString(rb)。 -
@RezaAghaei –
Convert.ToString(rb)打印rb:Application1.Module1+Record,而不是预期的>>3<<。 -
我使用了
Public Overrides Function ToString() As String,它显示了预期的结果。
标签: vb.net .net vb.net struct tostring boxing