Partilhar via


Alterações significativas do Visual Basic no Visual Studio 2012

A tabela a seguir lista as alterações que podem evitar um aplicativo que foi criado em Visual Basic 2010 de compilação em Visual Basic no Visual Studio 2012 e as alterações possam alterar o comportamento em tempo de execução de um aplicativo.

Categoria

Problema

Descrição

inferência de tipos

Em uma instrução return onde o operando é um literal de matriz, o tipo de matriz em tempo de execução é determinado a assinatura de função em vez de ser inferido do literal de matriz.

Essa alteração permite retornar um literal de matriz em locais de onde você não pode antes, como mostra o exemplo a seguir:

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

Essa alteração pode levar ao tipo de tempo de execução de um literal de matriz que é maior do que foi em Visual Basic 2010, como mostra o exemplo a seguir:

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

Expressões Lambda

Em uma expressão de For Each , agora você pode usar a variável de controle em uma expressão lambda.

O uso de uma variável de iteração de For Each em uma expressão lambda não causa um erro de tempo de compilação e não tem resultados inesperados, como mostra o exemplo a seguir:

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

Expressões LINQ

Em uma expressão de For Each , agora você pode usar a variável de controle em uma expressão LINQ.

O uso de uma variável de iteração de For Each em uma expressão LINQ não causa um erro de tempo de compilação e não tem resultados inesperados, como mostra o exemplo a seguir:

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

Resolução de sobrecarga

Se duas sobrecargas com correspondência dos parâmetros de tipo genérico um chamador igualmente bem mas uma sobrecarga são mais específicas, a sobrecarga mais específica é usada.

Esta condição causou um erro em tempo de compilação de resolução de sobrecarga no Visual Studio 2010.Em o exemplo a seguir, a linha de Process(theList) causa um erro em tempo de compilação no Visual Studio 2010.Em a versão atual, a linha coincide com a sobrecarga mais específica do método de 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

Consulte também

Referência

Para cada...Próxima instrução (Visual Basic)

Conceitos

Expressões lambda (Visual Basic)

Novidades para o Visual Basic no Visual Studio 2012

Outros recursos

Matrizes em Visual Basic

LINQ em Visual Basic

Introdução ao Visual Basic

Quando uma correção não quebrar de linguagem é quebrando?