Modifications avec rupture dans Visual Basic 2008
Mise à jour : Juillet 2008
Les tableaux suivants répertorient toutes les modifications qui peuvent empêcher une application créée dans Visual Studio 2005 de compiler dans Visual Studio 2008 ou qui peuvent modifier son comportement au moment de l'exécution.
Category |
Problème |
Description |
---|---|---|
Types nullables |
T étendu à T? est une conversion prédéfinie dans Visual Studio 2008. |
Dans Visual Studio 2005, vous pouvez créer une conversion définie par l'utilisateur pour permettre à T de s'étendre à Nullable(Of T). Dans le cadre d'une meilleure prise en charge des types nullables dans Visual Studio 2008, cette conversion est prédéfinie. Parce que la résolution de la surcharge prend en compte à la fois les conversions prédéfinies et les conversions définies par l'utilisateur, il existe un risque d'ambiguïté quand les deux conversions sont présentes. Par conséquent, un code qui contient une conversion étendue définie par l'utilisateur de T à T? est potentiellement ambigu dans Visual Studio 2008. Par exemple, l'appel à c3.Sub1 fonctionne dans Visual Studio 2005 dans le code suivant, mais provoque une erreur du compilateur dans Visual Studio 2008.
Pour résoudre ce problème, vous pouvez supprimer la conversion définie par l'utilisateur ou vous pouvez caster explicitement vers Class1 ou Class2 :
|
Résolution de surcharge |
Les différences de résolution de la surcharge entre classes génériques et non génériques ont été corrigées. |
Un bogue dans Visual Studio 2005 peut provoquer un comportement de résolution de la surcharge pour les classes génériques différent de celui des classes non génériques. Dans l'exemple suivant, Class1 et Class2 sont identiques mais Class2 a un paramètre générique défini. L'appel à c1.Sub1 dans Main est ambigu parce que l'argument passé peut créer une liaison à l'une ou l'autre surchage de Sub1 dans Class1. L'ambiguïté provoque une erreur du compilateur à la fois dans Visual Studio 2005 et Visual Studio 2008. L'appel à c2.Sub1 doit générer la même erreur, mais dans Visual Studio 2005 ce n'est pas le cas. À la place, la méthode crée une liaison à la surcharge libre de Sub1 dans Class2. Ce problème est résolu dans Visual Studio 2008. Les deux appels génèrent des erreurs du compilateur en raison de l'ambiguïté. C'est ce que montre le code suivant :
Pour résoudre ce problème, vous pouvez modifier les surcharges afin qu'elles ne soient plus ambiguës, ou vous pouvez spécifier les arguments de type explicitement :
|
Résolution de surcharge |
La résolution de la surcharge avec des paramètres génériques et ParamArray produit des résultats différents dans Visual Studio 2008. |
Le but de résolution de la surcharge est essayer de sélectionner la méthode candidate dont les paramètres correspondent le plus étroitement aux types des arguments passés à la méthode. Dans l'exemple de cette section, Sub1 est surchargé dans une hiérarchie d'héritage et est appelé avec les arguments de type Integer et Short. Les règles de résolution de surcharge dans Visual Studio 2005 et Visual Studio 2008 spécifient que les correspondances directes sont de meilleures correspondances que celles nécessitant des paramètres ParamArray. Toutefois, en utilisant les règles de résolution de surcharge de Visual Studio 2005, l'inférence de type échoue pour le candidat de surcharge dans la classe dérivée, Class2, parce que Y ne peut pas être à la fois un Integer et un Short et des correspondances exactes sont requises. Si les arguments sh et n étaient du même type, Sub1 dans Class2 serait préféré au candidat dans Class1, qui a un paramètre ParamArray. Toutefois, parce que les deux arguments ont des types différents, la surcharge de la classe de base dans Class1 est sélectionnée à la place. T est déduit comme étant Integer et Short s'étend à ParamArrayp. Visual Studio 2008 utilise un nouvel algorithme qui sélectionne les mêmes surcharges que Visual Studio 2005, sauf dans ce cas précis. Dans Visual Studio 2008, l'algorithme détermine qu'Integer est le type dominant dans cet exemple, parce que Short s'étend à Integer. Le paramètre de type Y dans la classe dérivée est déduit pour être Integer et Short s'étend à Integer. En conséquence, Sub1 est appelé dans la classe dérivée.
Vous pouvez forcer le comportement de Visual Studio 2005 en effectuant le cast de la variable c2 au type C1ass1 avant d'appeler Sub1 ou en passant l'argument sh comme un tableau.
|
Voir aussi
Concepts
Types génériques en Visual Basic
Référence
Historique des modifications
Date |
Historique |
Raison |
---|---|---|
Juillet 2008 |
Ajout d'une rubrique. |
Améliorations apportées aux informations. |