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は次のとおりです。クラスの 1 つは、他のクラスのサブクラスでなければなりません。これが、2 番目の例が正しく検証される理由です。

  • T0 -> ObjectT0 は Object のサブクラスであるため、内部の DirectCast ( ) は問題ありません。
  • T1 は Object のサブクラスであるため、外側の DirectCast ( Object -> T1) は問題ありません (もちろん、このようなキャストは実行時に失敗する可能性があります)。

あなたがしようとしている DirectCast ( ) は、特殊なケースまたは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)) 

または、2 番目のケース (最初のケースでも機能します):

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 に答える