以下通用方法给出了编译错误“错误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类型的对象。我做错了什么?
**编辑:我已经注释掉除了类声明之外的整个分布,但仍然会得到同样的错误。
答案 0 :(得分:2)
无论if语句如何,编译器都无法提前知道CreateDistribution的返回类型是否与类型t匹配。是否将线路改为此工作?
Return CType(CreateDistribution(ID), t)
显然与第二个相同。
答案 1 :(得分:2)
您需要将返回值向上转换为Object
,然后向下转换为t
。
例如:
Return CType(CType(CreateDistribution(ID), Object), t)
这两个演员是必要的,因为编译器不知道t
是Distribution
。因此,它不允许您从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