2008-11-08 4 views
2

VB.Net2005Les paramètres de type ne peuvent pas être utilisés comme qualificatifs

Code simplifié:

MustInherit Class InnerBase(Of Inheritor) 
End Class 

MustInherit Class OuterBase(Of Inheritor) 
    Class Inner 
     Inherits InnerBase(Of Inner) 
    End Class 
End Class 

Class ChildClass 
    Inherits OuterBase(Of ChildClass) 
End Class 

Class ChildClassTwo 
    Inherits OuterBase(Of ChildClassTwo) 
End Class 

MustInherit Class CollectionClass(Of _ 
     Inheritor As CollectionClass(Of Inheritor, Member), _ 
     Member As OuterBase(Of Member)) 
    Dim fails As Member.Inner ' Type parameter cannot be used as qualifier 
    Dim works As New ChildClass.Inner 
    Dim failsAsExpected As ChildClassTwo.Inner = works ' type conversion failure 
End Class 

Le message d'erreur sur la ligne "échoue" est dans le sujet, et "Member.Inner" est mis en surbrillance. Incidemment, la même erreur se produit en essayant d'appeler une méthode partagée de OuterBase. La ligne "works" fonctionne, mais il y a une douzaine (et en comptant) les classes ChildClass dans la vie réelle.

La ligne "failsAsExpected" est là pour montrer que, avec les génériques, chaque ChildClass a sa propre classe Inner distincte.

Ma question: existe-t-il un moyen d'obtenir une variable, dans la classe CollectionClass, définie comme type Member.Inner? Quelle est la différence critique que le compilateur ne peut pas suivre?

(je finalement en mesure de générer un objet en créant un objet factice de type et d'appeler param une méthode définie dans OuterBase. Pas l'approche plus propre.)

Modifier le code 02/12/2008 modifié pour rendre la deux classes "base" génériques.

Répondre

1
Dim succeeds as OuterBase.Inner 

.net ne pas ont C++ de combinaison de classes de modèle et typedefs, ce qui signifie que ce que vous essayez de faire est impossible, ni ne même pas de sens dans .net.

1

ChildClass.Inner et SomeOtherChildClass.Inner sont du même type. Voici un programme court mais complet pour démontrer:

Imports System 

MustInherit Class InnerBase 
End Class 

MustInherit Class OuterBase 
    Class Inner 
     Inherits InnerBase 
    End Class 
End Class 

Class ChildClass 
    Inherits OuterBase 
End Class 

Class OtherChildClass 
    Inherits OuterBase 
End Class 

Class Test 
    Shared Sub Main() 
     Dim x as new ChildClass.Inner 
     Dim y as new OtherChildClass.Inner 

     Console.WriteLine(x.GetType()) 
     Console.WriteLine(y.GetType()) 
    End Sub 
End Class 

La sortie est:

OuterBase+Inner 
OuterBase+Inner 

Qu'est-ce que vous essayez d'atteindre en utilisant des classes imbriquées « paramétrés »? Je soupçonne que soit cela ne fonctionnerait pas comme vous le voudriez, ou vous pouvez le réaliser juste en utilisant OuterBase.Inner pour commencer. Maintenant, si chacune de vos classes enfant déclarait sa propre classe imbriquée, ce serait une situation différente - et celle que les génériques ne vous aiderait pas.

+0

Bien sûr, vous avez raison. D'une certaine manière, j'ai mal interprété le code pensant OuterBase était générique - en faisant ChildClass: OuterBase + InnerClass différent de OtherChildClass: OuterBase + InnerClass. –