标题非常自我解释。可以毫无错误地声明这两个类,但我确信它们是不同的东西。
Class(Of T as OtherClass)我知道它意味着什么,并且已经使用了很多,但是Class(Of OtherClass)是如何不同的,何时应该使用它?
答案 0 :(得分:2)
当您使用[JsonConverter]
时,您告诉编译器您的泛型类型T必须是" OtherClass",因此当您使用Public Class Test(Of T As OtherClass)
时,您将具有以下属性和方法:班级" OtherClass"。
当您使用Activator.CreateInstanc(Of T)
时,您将提供名称" OtherClass"对于您的泛型类型,因此当您使用Public Class Test(Of OtherClass)
时,您将拥有Object的属性和方法。
看看这个例子:
这个编译错误因为clas" Type"不是IEnumerable
当我删除Activator.CreateInstance(Of Type)
:
错误消失了,因为T可以是任何对象。
答案 1 :(得分:0)
为避免混淆,最好将你的两个例子写成:
Class(Of T)
Class(Of T as OtherClass)
Class(Of T)
表示generic Class
可以接受T
的任何类型
将其实例化为Class(Of String)
,Class(Of Integer)
等等是合法的。
Class(Of T as OtherClass)
表示具有constraint的通用Class
。它只能接受满足约束的类型(从某种类型继承,实现某个接口,具有公共无参数构造函数,是引用类型/值类型)。
我也觉得你熟悉后者而不是前者有点奇怪。不受限制的Class(Of T)
更为常见。如果这不是您的经验,则可能表明您在使用遗传的地方使用泛型。
答案 2 :(得分:0)
你根本不能创建class(of otherType)!!这没用 例如,此代码无效:
Class test2(Of string)
结束课程 因为string是类型名称,不能是各种类型的占位符。 如果要对其执行特定操作,则应约束泛型类型。例如,您要创建泛型类型的实例:
函数createInstance(T为新)()为T
如您所见,“new”不是类或类型名称,但它支持具有新方法的任何类型。 另一个例子是你希望“T”是任何可以为null的类型:
obj = Nothing
End Sub
因此我们将T限制为“类”,与结构和值类型不同,它可以是可以为空的类型。