Considérons une classe MyForm
qui contient une implémentation masquée de Show()
. Il contient également une méthode CreateForm()
, qui accepte une instance de la forme et appelle le sous Ténébreux:La méthode générique fortement typée appelle la méthode de classe de base de son argument, au lieu d'une méthode ombrée dans T?
Public Class MyForm
Inherits Form
Public Shadows Sub Show()
MessageBox.Show("Shadowed implementation called!")
End Sub
End Class
...
Public Sub CreateForm(ByVal childForm As MyForm)
childForm.MdiParent = Me
childForm.Show()
childForm.Focus()
End Sub
Appelé avec CreateForm(New MyForm())
, la mise en œuvre de l'ombre Show()
est appelée correctement. Considérons maintenant la mise en œuvre générique suivante:
Public Sub CreateForm(Of T As Form)(ByVal childForm As T)
childForm.MdiParent = Me
childForm.Show()
childForm.Focus()
End Sub
Appelé avec CreateForm(Of MyForm)(New MyForm())
, cette méthode générique fortement typé la méthode n'invoque ombré.
Est-ce un bug ou manque-t-il quelque chose?
Cela a du sens, mais je ne comprends toujours pas comment/pourquoi le contexte de l'appelant n'a aucune incidence sur l'argument type. Cela ne signifierait-il pas qu'un générique défini comme 'SomeMethod (OfT) (ByVal arg As T)' aurait toujours un argument de type 'Object'? – Rob
@Rob, du point de vue des méthodes de liaison sur 'arg', oui, il est essentiellement considéré comme' Object'. Cette ligne est un peu floue dans VB.Net bien que, par défaut, l'option strict soit désactivée et qu'une liaison tardive se produise pour les méthodes non-Object. – JaredPar