代码之家  ›  专栏  ›  技术社区  ›  Simon

我的通用方法有什么问题?

  •  0
  • Simon  · 技术社区  · 15 年前

    以下泛型方法给出编译错误“类型为“Distribution”的错误13值无法转换为“t”:

    Public Shared Function CreateObject(Of t)(ByVal ID As Integer) As t
    
            Dim TType As Type = GetType(t)
    
            If TType Is GetType(Distribution) Then
                Return CreateDistribution(ID)
    
            ElseIf TType Is GetType(Accrual) Then
                Return CreateAccrual(ID)
    
            End If
    
    
        End Function
    

    CreateDistribution返回“Distribution”类型的对象。 我试图让方法根据提供的t类型执行操作,然后返回t类型的对象。我做错了什么?

    5 回复  |  直到 15 年前
        1
  •  2
  •   SLaks    15 年前

    您需要将返回值向上转换为 Object t .

    例如:

    Return CType(CType(CreateDistribution(ID), Object), t)
    

    这两个强制转换是必需的,因为编译器不知道这一点 Distribution . 因此,它不能允许你从 分布 T Integer ). 然而,一旦你向上转换到 对象 对象 T T
    先发制人的尖刻评论:是的,我知道指针不是这样的。

        2
  •  2
  •   David M    15 年前

    编译器无法提前知道CreateDistribution的返回类型是否与类型t匹配,而不管您的if语句如何。把线路改成这个行行吗?

    Return CType(CreateDistribution(ID), t)
    

    显然第二个也是一样。

        3
  •  1
  •   David Hay    15 年前

    泛型方法是在编译时解析的,因此编译器需要预先知道它将使用什么类型T编译函数。看起来您希望基于运行时检查执行返回,在这种情况下,您需要的不是泛型方法,而是返回所有可能的返回都从中继承的对象。您可以使用的最基本的方法是object,但显然,无论从何处调用它,都必须进行一些类型检查。

        4
  •  0
  •   Andrew Aylett    15 年前

    t

        5
  •  0
  •   TGnat    15 年前

    以下是一种更通用的方法来完成您要做的事情:

        Public Function CreateInstance(Of T)(ByVal ParamArray args() As Object) As T
            Dim obj As T
    
            If args IsNot Nothing AndAlso args.Length > 0 Then
                obj = CType(Activator.CreateInstance(GetType(T), args), T)
            Else
                obj = Activator.CreateInstance(Of T)()
            End If
    
            Return obj
        End Function