次の方法で共有


Visual Studio 2012 における Visual Basic の互換性に影響する変更点

次の表は Visual Studio 2012 の Visual Basic でコンパイル Visual Basic 2010 で作成され、変更がアプリケーションの実行時の動作を変更する可能性のあるアプリケーションを妨げる可能性がある変更の一覧を示します。

カテゴリ

懸案事項

説明

型の推論

オペランドが配列リテラルのreturnステートメントでは、ランタイムの配列型は、配列リテラルから推論されるのではなく、関数の定義によって決定されます。

この変更は、次の例に示すように、の前にできない適切な配列リテラルを返すことができます:

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

この変更は、広範な配列リテラルのランタイム型は、次の例に示すように Visual Basic 2010と、より発生することがあります:、

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

ラムダ式

For Each の式では、ラムダ式で制御変数を使用できます。

次の例に示すように、ラムダ式の For Each の反復変数の使用により、コンパイル時に警告が発生しないと、予期しない結果があります:

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

LINQの式

For Each の式では、LINQ式で制御変数を使用できます。

次の例に示すように、LINQ式の For Each の反復変数の使用により、コンパイル時に警告が発生しないと、予期しない結果があります:

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

オーバーロードの解決

ジェネリック型パラメーターの一致を持つ2台のオーバーロードが同様に対する呼び出し元ただし、次の1種類のオーバーロードされた場合、特定のオーバーロードが使用されます。

この条件ではVisual Studio 2010でオーバーロードの解決のコンパイル時のエラーが発生しました。次の例では、Process(theList) の行によりVisual Studio 2010でコンパイル エラーが発生します。現在のバージョンでは、行は 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

参照

関連項目

For Each...Next ステートメント (Visual Basic)

概念

ラムダ式 (Visual Basic)

Visual Studio 2012 における Visual Basic の新機能

その他の技術情報

Visual Basic における配列

Visual Basic における LINQ

Visual Basic の概要

中断、言語の中断または修正。