1

为什么这不是有效的 DirectCast:

Public Sub FB(OF T0 As IGH_Goo, T1 As IGH_Goo) _
             (ByVal A As DataTree(Of T0), _
              ByVal B As DataTree(Of T1)) 

  Dim val_A As T1 = DirectCast(A.FirstItem, T1)  
End Sub

而这是:

Public Sub FB(OF T0 As IGH_Goo, T1 As IGH_Goo) _
             (ByVal A As DataTree(Of T0), _
              ByVal B As DataTree(Of T1)) 

  Dim val_A As T1 = DirectCast(DirectCast(A.FirstItem, Object), T1)  
End Sub
4

1 回答 1

1

编译器不保证 T0 和 T1 可以相互转换。例如,T0 可能是某个类 C0(继承自 IGH_Goo),而 T1 可能是某个类 C1(也继承自 IGH_Goo)。

规则DirectCast是:其中一个类必须是另一个类的子类。这就是您的第二个示例正确验证的原因:

  • 内部 DirectCast ( T0 -> Object) 是可以的,因为 T0 是 Object 的子类。
  • 外部 DirectCast ( Object -> T1) 是可以的,因为 T1 是 Object 的子类(当然,这样的转换可能在运行时失败)。

除了T0 -> T1特殊情况T0 = T1T0 inherits from T1.

在第一种情况下,您的代码应为

Public Sub FB(Of T As IGH_Goo)
           (ByVal A As DataTree(Of T), ByVal B As DataTree(Of T)) 

或者,在第二种情况下(也适用于第一种情况):

Public Sub FB(OF T0 As T1, T1 As IGH_Goo)
           (ByVal A As DataTree(Of T0), ByVal B As DataTree(Of T1)) 
于 2009-10-21T18:47:13.387 回答