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 の概要
中断、言語の中断または修正。