セッションネタです。
前回→Visual Studio 2008 の Visual Basic における Visual Studio 2005 からの変更点。その1。
今回は2つ目の変更点を。
2.ジェネリック クラスと非ジェネリック クラスが存在する場合の オーバーロードの解決動作が異なる。
これは変更点というより、バグ修正だと思います。まずはこんなクラス↓があったとして
Namespace Demo2
Public Class Class1
Public Overloads Sub Method(Of T)(ByVal arg As T)
System.Console.WriteLine("てふてふ~")
End Sub
Public Overloads Sub Method(Of T As Structure)(ByVal arg As Nullable(Of T))
System.Console.WriteLine("さいさい~")
End Sub
End Class
End Namespace
もう一つはこれ↓。
Namespace Demo2
Public Class Class2(Of U)
Public Overloads Sub Method(Of T)(ByVal arg As T)
System.Console.WriteLine("てふてふ~")
End Sub
Public Overloads Sub Method(Of T As Structure)(ByVal arg As Nullable(Of T))
System.Console.WriteLine("さいさい~")
End Sub
End Class
End Namespace
この二つのクラスの違いはジェネリック パラメータ(Of U)があるかないかだけですね。
さてさて♪これらのクラスを使用して、以下のようなコードを記述します。
Namespace Demo2
Module Program
Sub Main()
Dim c1 As New Class1
Dim c2 As New Class2(Of String)
Dim n As New Nullable(Of Integer)
c1.Method(n)
c2.Method(n)
End Sub
End Module
End Namespace
実はこのコードに対するコンパイラの動作が Visual Studio 2008 と Visual Studio 2005 で異なります。
このコードを見ると、 (1)、(2)のどちら(ジェネリック パラメータの有無だけの違いを持つClass1、Class2)においてもオーバーロードの解決ができない(どちらのMethod に対してもバインドしうる。)ですよね?
あいまいさを指摘するコンパイル エラー(これらの引数に最も固有な、アクセス可能な '<method>' がないため、オーバーロードの解決に失敗しました)が生成されるはずです。
が!
Visual Studio 2005 では、ジェネリック パラメータ を持つClass2についての呼び出し (2) ではコンパイルエラーが発生せず、制限のないオーバーロードにバインドされました。
それが!
Visual Studio 2008 では(1)、(2)のどちらに対してもコンパイルエラーが生成されるようになっています♪