Share via


Modifications avec rupture dans Visual Basic 2010

Le tableau suivant répertorie toutes les modifications susceptibles d'empêcher une application créée dans Visual Basic 2008 d'être compilée dans Visual Basic 2010, ou susceptible de modifier son comportement au moment de l'exécution.

Catégorie

Problème

Description

Inférence de type de tableau

Les règles d'inférence pour les initialiseurs de tableau ont été modifiées.

Par exemple, Dim x() = {1, 2, 3} déduit le type Integer.

Dim x() = {1, 2.2, "3"} provoque une erreur du compilateur lorsque Option Strict a la valeur On.

Dans Visual Basic 2008, lorsque vous déclarez une variable tableau mais omettez le type de l'élément, le compilateur assume qu'il s'agit du type Object. Visual Basic 2010 introduit l'inférence pour les types d'éléments de tableau et déduit le type d'élément comme étant le type dominant du littéral de tableau.

S'il n'existe pas de type dominant, le type Object est utilisé par défaut. Dans ce cas, si Option Strict a la valeur On, une erreur de compilateur se produit.

Pour plus d'informations, consultez Tableaux dans Visual Basic.

Conflits d'attribution de noms

Les types figurant dans les espaces de noms importés au niveau du fichier ont priorité sur les types figurant dans les espaces de noms importés au niveau du projet.

Si deux espaces de noms contiennent chacun un type avec le même nom et si un type se trouve dans un espace de noms importé au niveau du projet et l'autre type de même nom se trouve dans un espace de noms importé au niveau du fichier, Visual Basic 2010 crée une liaison avec le type figurant dans l'espace de noms importé au niveau du fichier. Les versions antérieures créaient une liaison avec le type figurant dans l'espace de noms importé au niveau du projet. Pour plus d'informations, consultez Imports, instruction (espace de noms et type .NET).

Mots clés de requête en tant qu'identificateurs

L'utilisation d'un mot clé de requête en tant qu'identificateur peut produire des résultats inattendus.

Le compilateur Visual Basic accepte des mots clés en tant que noms d'identificateurs dans différents contextes. En raison des nouvelles règles de continuation de ligne implicite ajoutées dans Visual Basic 2010, une erreur peut se produire si vous utilisez un mot clé comme nom d'élément dans une requête LINQ qui omet des caractères de continuation de ligne.

L'exemple suivant utilise le mot clé Aggregate comme nom d'identificateur. Si l'identificateur aggregate suit immédiatement une requête, il est considéré comme partie intégrante de cette requête en raison des règles de continuation de la ligne implicite pour les clauses de requête. Dans cet exemple, cela provoque une erreur du compilateur.

Dim aggregate = 0
Dim numbers = {1, 2, 3, 4, 5}
Dim query As IEnumerable(Of Integer)

While aggregate < 5

    query = From i In numbers
            Skip aggregate
            Take 1
            Select i
    aggregate += 1

End While

Afin de vous assurer qu'une ligne n'est pas incluse implicitement dans la ligne de code précédente, ajoutez un saut de ligne supplémentaire avant la ligne de code, comme indiqué dans l'exemple suivant.

    query = From i In numbers
            Skip aggregate
            Take 1
            Select i

    aggregate += 1

Pour plus d'informations sur la continuation de ligne implicite, consultez Instructions dans Visual Basic.

Modules

Les modules sont compilés en tant que MustInherit.

Les modules sont désormais compilés en tant que MustInherit. Cela n'affecte pas le comportement des modules, mais peut affecter le code qui utilise la réflexion pour examiner les types créés par l'instruction Visual Basic Module. Pour plus d'informations, consultez Module, instruction.

Expressions lambda

Les expressions lambda anonymes génèrent des types uniques.

Le caractère unique des types délégués anonymes générés pour les expressions lambda est à présent garanti. Cela peut affecter le code qui évalue l'égalité des types des délégués anonymes, tel que le code dans l'exemple suivant.

Dim x = Function(a As Integer) a + 1
Dim y = Function(b As Integer) b + 1

' Returns True in Visual Basic 2008. Returns False in Visual Basic 2010.
Dim t = x.GetType().Equals(y.GetType())

Pour plus d'informations, consultez Expressions lambda (Visual Basic).

Variance dans les interfaces génériques

Les interfaces génériques peuvent introduire une ambiguïté.

Visual Basic 2010 prend en charge la variance (covariance et contravariance) dans les interfaces génériques. Une erreur de type avertissement concernant des interfaces ambiguës peut se produire lorsque vous implémentez plusieurs interfaces et qu'une interface dérive d'une autre interface.

Pour plus d'informations, consultez Variance dans les interfaces génériques (C# et Visual Basic).

Méthodes d'extension

Les méthodes locales sont préférées aux méthodes d'extension.

Si une méthode d'extension est définie avec le même nom et les mêmes paramètres que ceux d'une méthode définie pour un type, le compilateur crée une liaison avec la méthode locale et non avec la méthode d'extension. Ce comportement corrige le comportement de liaison incorrect dans Visual Basic 2008. Pour plus d'informations, consultez Méthodes d'extension (Visual Basic).

Types valeur Nullable

Si vous testez un type valeur Nullable pour Nothing à l'aide de l'opérateur =, comme indiqué dans le code suivant, une erreur de compilateur se produit.

Dim i? As Integer
If i = Nothing Then
  ' ...
End If

Si vous testez un type de valeur Nullable pour Nothing à l'aide de l'opérateur =, le résultat est False même si le type valeur Nullable est Nothing, ce qui n'est très probablement pas le résultat souhaité. Utilisez plutôt l'opérateur Is, comme indiqué dans l'exemple suivant.

Dim i? As Integer
If i Is Nothing Then
  ' ...
End If

Appel implicite de fonctions ou de propriétés sans paramètre

Si une fonction ou une propriété retourne une valeur indexable telle qu'une chaîne ou un tableau, vous pouvez utiliser la syntaxe raccourcie pour faire référence à un élément de la valeur de retour par index uniquement s'il n'existe pas de surcharges pour la fonction ou la propriété.

Prenons une fonction ou une propriété sans paramètre qui retourne une valeur indexable, comme indiqué dans l'exemple suivant.

Class Sample

    Public Function GetValue() As String
        Return "Default Value"
    End Function

End Class

Vous pouvez utiliser la syntaxe raccourcie pour faire référence à un élément de la valeur de retour par index comme illustré dans l'exemple suivant.

Dim o As Object = New Sample()
' Returns "D" if no overloads exist for the GetValue function.
Dim val = o.GetValue(0)

Visual Basic 2008 autorise cette syntaxe raccourcie pour les appels à liaison tardive même s'il existe des surcharges pour la fonction ou la propriété. Dans Visual Basic 2010, vous pouvez utiliser la syntaxe raccourcie pour faire référence à un élément de la valeur de retour par index uniquement s'il n'existe pas de surcharges pour la fonction ou la propriété.

Contraintes Class

La contrainte Class n'est plus utilisée par défaut.

Visual Basic 2008 déduit la contrainte Class pour un paramètre générique s'il est contraint par un deuxième paramètre générique lui-même contraint par la contrainte Class. Visual Basic 2010 ne déduit plus qu'un paramètre générique « hérite » de la contrainte Class. Cela est dû au fait que le premier paramètre générique peut être instancié avec un type qui implémente une interface mais qui n'est pas une classe. Les interfaces satisfont la contrainte Class.

Pour vous assurer qu'un paramètre générique est contraint en tant que classe, ajoutez la contrainte Class tel qu'indiqué dans l'exemple suivant.

    ' The following code causes a compiler error.
    ' Function RefEquals(Of T1 As T2, T2 As Class)(ByVal x As T1, ByVal y As T2) As Boolean
    '     Return y Is x
    ' End Function

    ' The following code is valid in Visual Basic 2010.
    Function RefEquals(Of T1 As {T2, Class}, T2 As Class)(ByVal x As T1, ByVal y As T2) As Boolean
        Return y Is x
    End Function

Pour plus d'informations, consultez Types génériques en Visual Basic (Visual Basic).

Méthodes de classes partielles

Si une méthode comportant des paramètres génériques contraints est déclarée dans plusieurs classes partielles, toutes les déclarations de la méthode doivent avoir des contraintes identiques.

Vous pouvez déclarer une méthode qui comporte des paramètres génériques dans plusieurs classes partielles. Dans Visual Basic 2008, le compilateur n'exige pas toujours que les contraintes appliquées aux paramètres génériques correspondent pour toutes les déclarations de la méthode. Visual Basic 2010 exige que toutes les déclarations de la méthode aient des contraintes identiques.

Pour plus d'informations, consultez Types génériques en Visual Basic (Visual Basic).

Arborescence de l'expression d'une expression lambda

Suppression du boxing inutile des instances de types de paramètres génériques

Dans Visual Basic 2008, à l'intérieur d'une arborescence de l'expression d'une expression lambda, si un type de paramètre générique est contraint par une interface, le fait d'appeler une méthode sur une instance de ce type entraîne toujours un boxing de cette instance. Dans Visual Basic 2010, l'instance ne fait l'objet d'un boxing que lorsque cela est nécessaire.

Pour plus d'informations sur le boxing et l'unboxing, consultez Spécification du langage Visual Basic.

Expression lambda et arborescence de l'expression

Une arborescence de l'expression d'une expression lambda peut retourner une arborescence de l'expression d'une expression lambda.

Dans Visual Basic 2008, si une expression lambda effectue un cast d'une expression lambda en arborescence de l'expression, le compilateur n'exécute pas le cast dans certains cas. Le compilateur Visual Basic 2010 effectue un cast correct des expressions lambda en arborescences d'expressions si le cast se produit dans une expression lambda.

Voir aussi

Concepts

Nouveautés de Visual Basic 2010

Autres ressources

Mise en route de Visual Basic