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

时间:2009-11-25 16:05:49

标签: .net generics

以下通用方法给出了编译错误“错误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返回“分布”类型的对象。 我试图让方法根据提供的t类型执行一个动作,然后返回一个t类型的对象。我做错了什么?

**编辑:我已经注释掉除了类声明之外的整个分布,但仍然会得到同样的错误。

5 个答案:

答案 0 :(得分:2)

无论if语句如何,编译器都无法提前知道CreateDistribution的返回类型是否与类型t匹配。是否将线路改为此工作?

Return CType(CreateDistribution(ID), t)

显然与第二个相同。

答案 1 :(得分:2)

您需要将返回值向上转换为Object,然后向下转换为t

例如:

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

这两个演员是必要的,因为编译器不知道tDistribution。因此,它不允许您从Distribution转换为t(就编译器而言,可能是Integer)。但是,一旦您向上转换为Object,第二次投射就可以了,因为根据定义,Object可以转换为t,无论t是什么类型。
先发制人的讽刺评论:是的,我知道指针不是这样。

答案 2 :(得分:1)

通用方法在编译时解析,因此编译器需要预先知道要用什么类型编译函数。看起来你正在寻找基于运行时检查的返回,在这种情况下,你需要一个返回所有可能返回的对象继承的方法,而不是泛型。你可以使用的最基本的是对象 - 但显然无论你从哪里调用它都必须进行一些类型检查。

答案 3 :(得分:0)

我认为你总是会遇到错误,因为至少有一个返回语句会出现类型不匹配的情况。编译器几乎肯定不够智能,只能解决其中只有一个可能被执行的t

答案 4 :(得分:0)

这是一种更通用的方法来完成你想要做的事情:

    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