[英]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)
这两个转换是必需的,因为编译器不知道t
是Distribution
。 因此,它不允许您从Distribution
为t
(就编译器而言,它可能是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.