2009-10-15 6 views
1

Comment se fait ce n'est pas un DirectCast valide:DirectCast ne pas accepter valide moulages à compiletime (VB.NET)

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 

alors que c'est:

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 

Répondre

1

Le compilateur n'a aucune garantie que T0 et T1 peut être converti l'un en l'autre. Par exemple, T0 peut être une classe C0 (héritée de IGH_Goo) et T1 peut être une classe C1 (héritant également de IGH_Goo).

La règle pour DirectCast est: Une des classes doit être une sous-classe de l'autre. Voilà pourquoi votre deuxième exemple correctement valide:

  • Le DirectCast intérieur (T0 -> Object) est OK, parce que T0 est une sous-classe de l'objet.
  • Le DirectCast externe (Object -> T1) est OK, car T1 est une sous-classe de l'objet (bien sûr, une telle distribution peut échouer à l'exécution).

Le DirectCast que vous essayez (T0 -> T1) ne fonctionnera jamais, sauf pour les cas particuliers T0 = T1 ou T0 inherits from T1.

Dans le premier cas, votre code doit lire

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

ou, dans le second cas (fonctionne aussi pour le premier cas):

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

Brillant, merci! –

Questions connexes