VB.NET类(Of OtherClass)和类(T作为OtherClass)之间的区别

时间:2016-04-08 00:07:05

标签: vb.net class

标题非常自我解释。可以毫无错误地声明这两个类,但我确信它们是不同的东西。

Class(Of T as OtherClass)我知道它意味着什么,并且已经使用了很多,但是Class(Of OtherClass)是如何不同的,何时应该使用它?

3 个答案:

答案 0 :(得分:2)

当您使用[JsonConverter]时,您告诉编译器您的泛型类型T必须是" OtherClass",因此当您使用Public Class Test(Of T As OtherClass)时,您将具有以下属性和方法:班级" OtherClass"。

当您使用Activator.CreateInstanc(Of T)时,您将提供名称" OtherClass"对于您的泛型类型,因此当您使用Public Class Test(Of OtherClass)时,您将拥有Object的属性和方法。

看看这个例子:

enter image description here

这个编译错误因为clas" Type"不是IEnumerable

当我删除Activator.CreateInstance(Of Type)

enter image description here

错误消失了,因为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)!!这没用 例如,此代码无效:

  1. Class test2(Of string)

  2. 结束课程 因为string是类型名称,不能是各种类型的占位符。 如果要对其执行特定操作,则应约束泛型类型。例如,您要创建泛型类型的实例:

  3. 函数createInstance(T为新)()为T

  4. 返回新T()
  5. 结束功能
  6. ... ...
  7. myObject = createInstance(of object)()
  8. 如您所见,“new”不是类或类型名称,但它支持具有新方法的任何类型。 另一个例子是你希望“T”是任何可以为null的类型:

    1. Sub setToNull(Of T As Class)(obj As T)
    2. obj = Nothing

    3. End Sub

    4. ... ...
    5. setToNull(对象)(myObj)
    6. 因此我们将T限制为“类”,与结构和值类型不同,它可以是可以为空的类型。