オーバーロードの解決 (Visual Basic)
Visual Basic コンパイラは、複数のオーバーロードされたバージョンでプロシージャが定義されている場合に呼び出すオーバーロードを決定する必要があります。 次の手順を実行して決定します。
- アクセシビリティ。 呼び出し元のコードから呼び出すことができないようにするためのアクセス レベルが設定されたオーバーロードが排除されます。
- パラメーターの数。 これにより、呼び出しで指定されたパラメーターとは異なる数のパラメーターを定義するオーバーロードが排除されます。
- パラメーター データ型。 コンパイラは、拡張メソッドよりもインスタンス メソッドを優先します。 プロシージャ呼び出しに一致するように拡大変換のみを必要とするインスタンス メソッドが見つかった場合、すべての拡張メソッドが削除されます。 コンパイラは、インスタンス メソッドの候補のみで続行されます。 そのようなインスタンス メソッドが見つからない場合は、インスタンス メソッドと拡張メソッドの両方で続行されます。 この手順では、呼び出し元の引数のデータ型をオーバーロードで定義されたパラメーター型に変換できないオーバーロードを排除します。
- 縮小変換。 呼び出し元の引数型から定義されたパラメーター型への縮小変換を必要とするオーバーロードが不要になります。 この手順は、型チェック スイッチ (Option Strict ステートメント) が
On
かOff
かに関係なく実行されます。 - 最少の拡大変換。 コンパイラは、残りのオーバーロードをペアで考慮します。 ペアごとに、定義されたパラメーターのデータ型が比較されます。 いずれかのオーバーロード内の型がすべて、もう一方のオーバーロード内の対応する型に拡大された場合、コンパイラは後者を排除します。 つまり、最小限の拡大を必要とするオーバーロードが保持されます。
- オーバーロード解決の優先順位。 コンパイラは、候補となるオーバーロードの最大値よりも低い OverloadResolutionPriorityAttribute を持つオーバーロードを削除します。 この属性を持たないオーバーロードには、既定値の 0 が割り当てられます。
- 単一候補。 これは、1 つのオーバーロードのみが残るまでペアのオーバーロードの検討を続け、そのオーバーロードの呼び出しを解決します。 コンパイラがオーバーロードを 1 つの候補に減らせない場合は、エラーが生成されます。
次の図は、呼び出すオーバーロードされた一連のバージョンを決定するプロセスを示しています。
のフロー図
次の例は、このオーバーロード解決プロセスを示しています。
Overloads Sub z(ByVal x As Byte, ByVal y As Double)
End Sub
Overloads Sub z(ByVal x As Short, ByVal y As Single)
End Sub
Overloads Sub z(ByVal x As Integer, ByVal y As Single)
End Sub
Dim r, s As Short
Call z(r, s)
Dim p As Byte, q As Short
' The following statement causes an overload resolution error.
Call z(p, q)
最初の呼び出しでは、最初の引数 (Short
) の型が対応するパラメーター (Byte
) の型に絞り込まれるため、コンパイラは最初のオーバーロードを排除します。 次に、2 番目のオーバーロード (Short
および Single
) の各引数の型が、3 番目のオーバーロード (Integer
および Single
) の対応する型に拡大されるため、3 番目のオーバーロードは削除されます。 2 番目のオーバーロードでは、より少ない拡大が必要になるため、コンパイラは呼び出しに使用します。
2 番目の呼び出しでは、コンパイラは縮小に基づいてオーバーロードを排除できません。 引数型の拡大が少ない状態で 2 番目のオーバーロードを呼び出すことができるため、最初の呼び出しと同じ理由で 3 番目のオーバーロードが削除されます。 ただし、コンパイラは最初のオーバーロードと 2 番目のオーバーロードの間で解決できません。 それぞれ、もう一方の対応する型に拡大変換されるパラメーターの型が定義されています (Byte
から Short
、Single
から Double
)。 したがって、コンパイラはオーバーロード解決エラーを生成します。
オーバーロードされた Optional
と ParamArray
引数
最後のパラメーターが一方では Optional、もう一方では ParamArray として宣言されている点を除き、プロシージャの 2 つのオーバーロードが同じシグネチャを持つ場合、コンパイラはそのプロシージャの呼び出しを次のように解決します。
呼び出しで最後の引数が次のように指定された場合 | コンパイラは、最後の引数を次のように宣言するオーバーロードの呼び出しを解決します。 |
---|---|
値なし (引数を省略) | Optional |
1 つの値 | Optional |
コンマ区切りリスト内の 2 つ以上の値 | ParamArray |
任意の長さの配列 (空の配列を含む) | ParamArray |
関連項目
.NET