我有一个overloaded assignment operator
的课程Public Class Timestamp
ReadOnly _value As String
Public Sub New(value As String)
Me._value = value
End Sub
Public Shared Widening Operator CType(ByVal input As String) As Timestamp
Return New Timestamp(input)
End Operator
End Class
这允许进行以下两种扩展转换:
Dim t1 As Timestamp = "1314"
Dim t2 As Timestamp = CType("1314", Timestamp)
因此,它会很快从类型String
更改为类型Timestamp
。
但是,如果我有一个将Timestamp作为泛型的方法,则转换不再有效 例如,对于以下方法:
Private Function GenericCast(Of T)(input As Object, output As T) As T
Return CType(input, T)
End Function
如果我这样称呼它:
Dim t3 as Timestamp
t3 = GenericCast("1314", t3)
我会收到以下错误:
但我们已经知道我绝对可以在这些类型之间进行转换 为什么它在运行时不能与Generics一起使用?
答案 0 :(得分:1)
可能的解决方案是使用CTypeDynamic
代替CType
。
Private Function GenericCastV2(Of T)(input As Object, output As T) As T
output = CTypeDynamic(Of T)(input)
Return output
End Function
我知道这不会回答你的“为什么”的问题,但这只是我的假设。我的直觉答案是,它与VB编译器在决定调用哪个辅助方法以完成转换时所做的决定有关。作为问题的潜在线索,以下概念函数将不会进行事件编译,因为需要对所有类型的String进行有效转换。
Private Function GenericCastConcept(Of T)(input As Object, output As T) As T
output = CType(input.ToString, T)
Return output
End Function