Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais

Changements majeurs au niveau de Visual Basic dans Visual Studio 2012

Le tableau suivant répertorie les modifications qui peuvent empêcher une application créée dans Visual Basic 2010 de compiler dans Visual Basic dans Visual Studio 2012 et les modifications peuvent modifier le comportement à l'exécution d'une application.

Catégorie

Problème

Description

Inférence de type

Dans une instruction return dans lequel l'opérande est un littéral de tableau, le type tableau d'exécution est déterminé à partir de la signature de la fonction au lieu d'être déduit du littéral de tableau.

Cette modification permet de retourner un littéral de tableau à des endroits avant que vous ne pouvez pas, comme le montre l'exemple suivant :

Function GetArrayLiteral(ByVal number As Integer) As Integer()
    If number < 0 Then
        ' In Visual Studio 2010, this array literal is
        ' is inferred to be an array of objects, which
        ' cannot be converted to an array of integers. 
        ' In the current version, this array literal is
        ' inferred to be an array of integers, which is
        ' the return type of the function. 
        Return {}
    Else
        Return {number}
    End If
End Function

Cette modification peut entraîner un type au moment de l'exécution d'un littéral de tableau est plus large que ce qu'il était dans Visual Basic 2010, comme le montre l'exemple suivant :

Private Sub ArrayLiterals()
    Dim theArray = GetArray()
    Console.WriteLine(theArray.GetType().FullName) 
End Sub

Private Function GetArray() As Object()
    Return {"chromatic", "infinitesimal"}
End Function

' Output in the current version:
'   System.Object[]
' Output in Visual Studio 2010:
'   System.String[]

Expressions lambda

Dans une expression d' For Each , vous pouvez maintenant utiliser la variable de contrôle dans une expression lambda.

L'utilisation d'une variable d'itération For Each dans une expression lambda n'entraîne plus un avertissement de compilation et n'a plus des résultats inattendus, comme indiqué dans l'exemple suivant :

Dim methods As New List(Of Action)
For Each word In {"hello", "world"}
    methods.Add(Sub() Console.Write(word & " "))
Next
methods(0)() 
methods(1)() 

' Output in the current version: 
'   hello world
' Output in Visual Studio 2010: 
'   world world

Expressions LINQ

Dans une expression d' For Each , vous pouvez maintenant utiliser la variable de contrôle dans une expression LINQ.

L'utilisation d'une variable d'itération For Each dans une expression LINQ n'entraîne plus un avertissement de compilation et n'a plus des résultats inattendus, comme indiqué dans l'exemple suivant :

Dim lines As New List(Of IEnumerable(Of String)) 

For Each number In {1, 2, 3}
    Dim line = From letter In {"a", "b", "c"}
            Select number.ToString & letter

    lines.Add(line) 
Next

For Each line In lines
    For Each entry In line
        Console.Write(entry & " ")
    Next
    Console.WriteLine()
Next

' Output in the current version: 
'  1a 1b 1c
'  2a 2b 2c
'  3a 3b 3c

' Output in Visual Studio 2010: 
'  3a 3b 3c
'  3a 3b 3c
'  3a 3b 3c

Résolution de surcharge

Si deux surcharges avec la correspondance de paramètres de type générique un appelant ainsi mais une surcharge est plus spécifique, plus de surcharge spécifique est utilisée.

Cette condition a causé une erreur de compilation de résolution de surcharge dans Visual Studio 2010. Dans l'exemple suivant, la ligne d' Process(theList) provoque une erreur de compilation dans Visual Studio 2010. Dans la version actuelle, la ligne correspond plus de surcharge spécifique de la méthode d' Process .

Private Sub Test()
    Dim theList As New List(Of Integer)
    Process(theList)

    Dim theQueue As New Queue(Of Integer)
    Process(theQueue)
End Sub

Private Sub Process(Of T)(ByVal theList As List(Of T))
    Debug.WriteLine("first overload")
End Sub

Private Sub Process(Of T)(ByVal x As T)
    Debug.WriteLine("second overload")
End Sub

' Output:
'   first overload
'   second overload

Ajouts de la communauté

AJOUTER
Afficher: