【问题标题】:Generic Casting doesn't work with overloaded Assignment Operator泛型转换不适用于重载的赋值运算符
【发布时间】:2016-09-05 20:57:54
【问题描述】:

设置

我有一堂课,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”类型的对象转换为“Timestamp”类型。

但我们已经知道我绝对可以在这些类型之间进行转换。
为什么它在运行时不适用于泛型?

【问题讨论】:

  • 这很奇怪,因为我有一个通用集合类,它做几乎完全相同的事情(CType 一个装箱的值返回到所需的类型)。试图找出差异。这可能是solution (long way around):
  • 这是不可能的,它只适用于接口

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


【解决方案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

【讨论】:

  • 确实很酷。 CTypeDynamic 可以解决问题,并且可能更适用于转换为泛型类型。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2014-10-19
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2014-05-24
  • 2017-04-28
  • 2021-08-27
相关资源
最近更新 更多