繁体   English   中英

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

[英]What's wrong with my generic method?

以下通用方法给出了编译错误“错误13类型'Distribution'的值不能转换为'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的对象。 我究竟做错了什么?

**编辑:我已经注释掉除了类声明以外的所有Distribution,并且仍然收到相同的错误。

不管您是否使用if语句,编译器都无法提前知道CreateDistribution的返回类型将与类型t相匹配。 将线路更改为此有效吗?

Return CType(CreateDistribution(ID), t)

显然,第二次相同。

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

例如:

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

这两个转换是必需的,因为编译器不知道tDistribution 因此,它不允许您从Distributiont (就编译器而言,它可能是Integer )。 但是,一旦您转换为Object ,第二次转换就可以了,因为Object可以定义为t ,无论t是什么类型。
先发制人的狡猾评论:是的,我知道这对指针不是正确的。

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

我认为您总是会出错,因为至少有一个return语句将具有类型不匹配。 几乎可以肯定,编译器不够聪明,无法解决在给定的t只能执行其中一个的问题。

这是完成您要尝试执行的操作的更通用的方法:

    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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM