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.

Module Module1
Sub Main()
Dim c3 As New Class3
Dim sh As Short = 2
' The following statement compiles in Visual Studio 2005,
' but causes an error in Visual Studio 2008.
'c3.Sub1(sh)
End Sub
End Module
Class Class1
Public Shared Widening Operator CType(ByVal s As _
Nullable(Of Short)) As Class1
Return New Class1()
End Operator
End Class
Class Class2
Public Shared Widening Operator CType(ByVal n As Integer) As Class2
Return New Class2()
End Operator
End Class
Class Class3
Sub Sub1(ByVal c As Class1)
End Sub
Sub Sub1(ByVal c As Class2)
End Sub
End Class

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 :

c3.Sub1(CType(sh, Class1))

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 :

Module Module1
Sub Main()
Dim c1 As New Class1
Dim c2 As New Class2(Of String)
' The following statement causes a compiler error in both
' Visual Studio 2005 and Visual Studio 2008.
'c1.Sub1(New Nullable(Of Integer))
' The following statement causes a compiler error only
' in Visual Studio 2008.
'c2.Sub1(New Nullable(Of Integer))
End Sub
End Module
Class Class1
Sub Sub1(Of T)(ByVal arg As T)
Console.WriteLine("Unconstrained Sub1 in Class1")
End Sub
Sub Sub1(Of T As Structure)(ByVal arg As Nullable(Of T))
Console.WriteLine("Constrained Sub1 in Class1")
End Sub
End Class
Class Class2(Of U)
Sub Sub1(Of T)(ByVal arg As T)
Console.WriteLine("Unconstrained Sub1 in Class2")
End Sub
Sub Sub1(Of T As Structure)(ByVal arg As Nullable(Of T))
Console.WriteLine("Constrained Sub1 in Class2")
End Sub
End Class

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 :

c1.Sub1(Of Integer?)(New Nullable(Of Integer))
c2.Sub1(Of Integer?)(New Nullable(Of Integer))

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.

Module Module1
Sub Main()
Dim c2 As New Class2
Dim n As Integer
Dim sh As Short
c2.Sub1(n, sh)
End Sub
Class Class1
Sub Sub1(Of T)(ByVal arg1 As T, ByVal ParamArray p() As Integer)
Console.WriteLine("Visual Studio 2005 calls Sub1 " & _
"in the *base* class.")
End Sub
End Class
Class Class2 : Inherits Class1
Overloads Sub Sub1(Of Y)(ByVal arg1 As Y, ByVal arg2 As Y)
Console.WriteLine("Visual Studio 2008 calls Sub1 " & _
"in the *derived* class.")
End Sub
End Class
End Module

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.

' You can cast variable c2 to Class1 in order to force Visual
' Studio 2005 behavior.
CType(c2, Class1).Sub1(n, sh)
' Alternatively, you can pass sh as an array.
c2.Sub1(n, New Integer() {sh})

Voir aussi

Concepts

Résolution de surcharge

Types valeur nullables

Types génériques en Visual Basic

Référence

ParamArray

Historique des modifications

Date

Historique

Raison

Juillet 2008

Ajout d'une rubrique.

Améliorations apportées aux informations.