dans les méthodes générales d'extension C# fonctionne très bien dans VB.Net et vice versa. La seule exception est lorsque le paramètre this
est explicitement tapé à Object
. Pour des raisons héritées, VB.Net ne prend pas en charge l'utilisation de méthodes d'extension sur les références tapées Object
.
La raison pour laquelle est le potentiel de provoquer la recompilation silencieuse du code avec différentes sémantiques. VB.Net (et C#) a pris la position que l'importation d'un espace de noms qui contient des méthodes d'extension ne doit pas entraîner une reliure silencieuse du code existant à la méthode d'extension. Si VB.Net autorisait les méthodes d'extension sur Object
, il serait alors possible que les appels liés tardivement se reconnectent silencieusement à la méthode d'extension et donc changent le code.
Par exemple. Considérez ce qui suit écrit avant votre méthode d'extension.
Dim local As Object = ...
local.GetProps() ' This is a late bound call
Si VB.Net a permis à la méthode d'extension GetProps
à définir sur Object
puis importer simplement votre espace de noms changerait le sens de GetProps
de fin lié à un appel de méthode d'extension.
Le classeur d'exécution VB.Net ne pourrait-il pas prendre en compte les méthodes d'extension si la méthode spécifiée ne fait pas partie de la classe de l'objet? Ou les méthodes d'extension ne sont-elles pas disponibles lors de l'exécution? – Gabe
@Gabe est-il possible pour le classeur d'exécution d'envisager des méthodes d'extension ... oui. Cela nécessiterait plusieurs modifications (y compris la transmission de tous les espaces de noms importés dans le cadre de l'appel lié tardivement). Mais cela pourrait être fait pour fonctionner. Le problème est cependant que cela créerait un comportement imprévisible car l'ensemble des méthodes considérées pour la liaison tardive serait modifié par ce que DLL/EXE ont été chargés dans le processus. Cela signifie qu'une simple modification de l'ordre de chargement des DLL peut modifier la façon dont 'GetProps' a été interprété. C'est une perspective très effrayante – JaredPar
Dans ce cas, le compilateur peut résoudre 'GetProps' comme une méthode d'extension et transmettre seulement celui-là au classeur d'exécution pour une utilisation en tant que solution de repli. Bien qu'il puisse être agréable (et/ou effrayant) d'avoir des méthodes d'extension résolues dynamiquement à l'exécution, il ne semble pas nécessaire d'obtenir le comportement attendu par l'OP. – Gabe