Udostępnij za pośrednictwem


Visual Basic — przełomowe zmiany w Visual Studio 2012

Poniższa tabela zawiera listę zmian, które mogą uniemożliwić aplikacji, która została utworzona w Visual Basic 2010 z kompilacji w Visual Basic w programie Visual Studio 2012 i zmiany może zmienić zachowanie wykonywania aplikacji.

Kategoria

Problem

Opis

Wnioskowanie

W instrukcji Return, gdzie argument jest tablicą literału typ tablicy runtime zależy od funkcja podpis zamiast zgłaszającej Literał tablicowy.

Ta zmiana pozwala zwraca tablicę literału w miejscach, gdzie nie przed, jak pokazano w następującym przykładzie:

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

Ta zmiana może spowodować runtime typ tablicy literał jest szersza niż to było w Visual Basic 2010, jak w poniższym przykładzie:

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[]

Wyrażenia lambda

W For Each wyrażenie, można teraz używać zmienna kontrolna w wyrażenie lambda.

Użycie For Each Zmienna iteracji w wyrażenie lambda nie powoduje już ostrzeżenie kompilacji i nie ma już nieoczekiwane wyniki, jak poniższy przykład ilustruje:

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

Wyrażenia LINQ

W For Each wyrażenie, można teraz użyć zmiennej kontrolnej w wyrażeniu LINQ.

Użycie For Each Zmienna iteracji w wyrażeniu LINQ, nie powoduje już ostrzeżenie kompilacji i nie ma już nieoczekiwane wyniki, jak poniższy przykład ilustruje:

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

Przeciążenia

Jeśli dwa przeciążeń z parametrami typu rodzajowego pasuje rozmówcy równie dobrze, ale jeden przeciążenie jest bardziej szczegółowy, bardziej przeciążenie jest używany.

Warunek ten spowodował błąd kompilacji rozpoznawania przeciążenia w Visual Studio 2010.W poniższym przykładzie Process(theList) linii powoduje błąd kompilacji w Visual Studio 2010.W bieżącej wersji pasuje do bardziej szczegółowych przeciążenie linii Process metoda.

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

Zobacz też

Informacje

Dla każdego...Następna instrukcja (Visual Basic)

Koncepcje

Wyrażenia lambda (Visual Basic)

Co nowego w Visual Basic dla Visual Studio 2012

Inne zasoby

Tablice w języku Visual Basic

LINQ w języku Visual Basic

Wprowadzenie do programu Visual Basic

Kiedy łamie fix języka twardej?