Generic Casting不适用于重载的Assignment Operator

时间:2016-05-10 18:12:34

标签: .net vb.net generics operator-overloading

设置

我有一个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)

我会收到以下错误:

  

无法转换类型为' System.String'的对象输入'时间戳'。   Unable to cast object of type 'System.String' to type 'Timestamp'.

但我们已经知道我绝对可以在这些类型之间进行转换 为什么它在运行时不能与Generics一起使用?

1 个答案:

答案 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