セッションネタです。
タイトルの通り、Visual Studio 2008 の Visual Basic コンパイラ は既存のコードに対する動作が Visual Studio 2005 から変更になっている部分があります。つまり、Visual Studio 2005 の Visual Basic で書かれたコードを Visual Studio 2008 でコンパイルした場合、異なる結果となる可能性があるということですね。
というわけで、ひょんなことからハマったりして凹む前にちょっと確認しておきましょう♪
1.ジェネリック パラメータと ParamArray パラメータを使用した場合の オーバーロードの解決動作が異なる。
さて、一つ目です。まずはコードから♪
Namespace Demo1
Public Class Class1
Public Overloads Sub Method(Of T)(ByVal a As T, ByVal ParamArray b() As Integer)
System.Console.WriteLine("おぱおぱ~")
End Sub
Public Overloads Sub Method(Of Y)(ByVal a As Y, ByVal b As Y)
System.Console.WriteLine("ばよばよ~")
End Sub
End Class
End Namespace
Demo1.Method はオーバーロードされていますね。どちらもジェネリック パラメータを持つジェネリック メソッドで、(1) のほうは2つ目の引数が ParamArray、(2) のほうはジェネリック型となっています。
では、以下のコードで Demo1.Method を呼び出した場合、実行されるのはどちらのオーバーロードでしょうか?
Namespace Demo1
Module Program
Sub Main()
Dim c As New Class1
Dim i As Integer
Dim s As Short
c.Method(i, s)
End Sub
End Module
End Namespace
実はこの呼び出しによって実行されるオーバーロードが Visual Studio 2008 と Visual Studio 2005 で異なります。
Visual Studio 2005 では (1) のメソッドが呼び出されます。これは、ジェネリックである Y に Integer 型と Short 型 の2つを指定することができず、s の型 である Short 型 は ParamArray である b へ拡張されるために起こります。
これに対して Visual Studio 2008 では (2) のメソッドが呼び出されます。これは Short 型が Integer 型に拡張されることによってジェネリックである Y は Integer 型 と推論されるためです。