Visual Basic 2008 の互換性に影響する変更点

更新 : 2008 年 7 月

次の表に示す変更点により、Visual Studio 2005 で作成されたアプリケーションが Visual Studio 2008 でコンパイルできなくなる、または実行時の動作が変わる可能性があります。

分類

問題

説明

null 許容型

T から T? への拡大変換が、Visual Studio 2008 であらかじめ定義されている。

Visual Studio 2005 では、T を Nullable(Of T) に拡大するユーザー定義の変換を作成できます。Visual Studio 2008 では null 許容型のサポートが強化されており、この変換もあらかじめ定義されています。

オーバーロード解決では、あらかじめ定義されている変換とユーザー定義の変換の両方が考慮されるため、どちらの変換も存在する場合、あいまいさが生じる可能性があります。そのため、ユーザーが定義した T から T? への拡大変換が含まれているコードは、Visual Studio 2008 ではあいまいになる可能性があります。

たとえば、次のコードでは c3.Sub1 を呼び出します。これは Visual Studio 2005 では正常に処理されますが、Visual Studio 2008 ではコンパイラ エラーが発生します。

この問題を解決するには、ユーザー定義の変換を削除するか、Class1 または Class2 に対して明示的なキャストを実行します。

オーバーロードの解決法

オーバーロードの解決方法がジェネリック クラスと非ジェネリック クラスで異なる問題が修正された。

Visual Studio 2005 のバグによって、ジェネリック クラスのオーバーロード解決動作が非ジェネリック クラスの場合と異なる場合がありました。次の例では、Class1 と Class2 はほぼ同一ですが、Class2 ではジェネリック パラメータが定義されています。渡された引数が Class1 の Sub1 のどちらかのオーバーロードにバインドされる可能性があるため、Main の c1.Sub1 への呼び出しがあいまいになります。このあいまいさが原因で、Visual Studio 2005 と Visual Studio 2008 のどちらでもコンパイラ エラーが発生します。

c2.Sub1 を呼び出す場合でも同じエラーが発生する必要がありますが、Visual Studio 2005 では発生しません。その代わりに、メソッドが Class2 の Sub1 の無制約のオーバーロードにバインドされます。

この問題は Visual Studio 2008 で修正されました。どちらを呼び出しても、あいまいさが原因のコンパイラ エラーが発生します。この 2 つの処理を次のコードに示します。

この問題を解決するには、あいまいさが解消されるようにオーバーロードを変更するか、型引数を明示的に指定します。

オーバーロードの解決法

Visual Studio 2008 では、ジェネリック パラメータと ParamArray パラメータで、オーバーロードの解決で異なる結果が発生する。

オーバーロードの解決の目的は、メソッドに渡された引数の種類に最も近いパラメータを持つ候補メソッドを選択することです。このセクションの例では、継承階層全体で Sub1 がオーバーロードされており、Integer 型と Short 型の引数を使用して呼び出されます。

Visual Studio 2005 でも Visual Studio 2008 でも、オーバーロードの解決規則では、ParamArray パラメータが必要な一致よりも、直接一致の方が優先されます。しかし、Visual Studio 2005 のオーバーロードの解決規則を使用する場合、Y が Integer にも Short にもならないため、派生クラス Class2 のオーバーロード候補の型の推定に失敗し、完全一致が必要になります。sh と n のどちらの引数も同じ型である場合、Class2 の Sub1 は Class1 の候補 (ParamArray パラメータを持つ) よりも優先されます。ただし、この 2 つの引数の型が異なる場合、代わりに Class1 の基本クラス オーバーロードが選択されます。T は Integer であると推論され、Short が ParamArrayp に拡大変換されます。

この特殊なケースを除いて、Visual Studio 2008 の新しいアルゴリズムでは Visual Studio 2005 と同じオーバーロードが選択されます。Visual Studio 2008 では、この例の場合は Short が Integer に拡大されているため、Integer が最も優先度の高い型であると判断されます。派生クラスの型パラメータ Y は Integer であると推論され、Short が Integer に拡大変換されます。その結果、派生クラスの Sub1 が呼び出されます。

Sub1 を呼び出す前に変数 c2 を C1ass1 型にキャストするか、引数 sh を配列として渡すことで、Visual Studio 2005 の動作を強制的に指定できます。

参照

概念

オーバーロードの解決法

null 許容値型

Visual Basic におけるジェネリック型

参照

ParamArray

履歴の変更

日付

履歴

理由

2008 年 7 月

トピックを追加

情報の拡充