オーバーロードの解決法 (Visual Basic)
オーバーロードされたバージョンが複数定義されているプロシージャが呼び出された場合、Visual Basic のコンパイラは、どのオーバーロードを呼び出すのかを判断する必要があります。 この判断は、次の手順で行われます。
アクセシビリティ。 呼び出し元のコードから呼び出すことができないアクセス レベルを持つオーバーロードを除外します。
パラメーターの数。 呼び出しで指定されている数と異なる数のパラメーターが定義されているオーバーロードを除外します。
パラメーターのデータ型 コンパイラは、拡張メソッドよりインスタンス メソッドを優先します。 インスタンス メソッドが、プロシージャの呼び出しに一致するためには拡大変換のみが必要だと判断された場合、すべての拡張メソッドはドロップされ、コンパイラはインスタンス メソッドの候補のみに対して操作を続行します。 このようなインスタンス メソッドが見つからなかった場合には、インスタンス メソッドと拡張メソッドの両方に対して操作が続行されます。
呼び出し元の引数のデータ型を定義されているパラメーター型に変換できないオーバーロードが、ここで除外されます。
縮小変換。 呼び出し元の引数の型から定義されているパラメーターの型への縮小変換が必要なオーバーロードを除外します。 これは型チェックのスイッチ (Option Strict ステートメント) が On でも Off でも同じです。
最小の拡大。 残りのオーバーロードをペアと見なします。 各ペアごとに、定義されているパラメーターのデータ型を比較します。 一方のオーバーロードのすべての型がもう一方のオーバーロードの対応する型に拡大変換される場合は、後者を除外します。 つまり、拡大変換が最も少なくて済むオーバーロードが残されます。
1 つの候補。 残りのオーバーロードが 1 つだけになるまでこの比較を続け、残った 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)
1 回目の呼び出しでは、コンパイラは最初のオーバーロードを除外します。1 つ目の引数の型 (Short) が、対応するパラメーターの型 (Byte) よりも大きいからです。 次に、3 番目のオーバーロードを除去します。2 番目のオーバーロードの各引数型 (Short と Single) よりも、3 番目のオーバーロードで対応する引数型 (Integer と Single) の方が大きいからです。 2 番目のオーバーロードの方が拡大変換が少なくて済むため、コンパイラは 2 番目を使用して呼び出します。
2 回目の呼び出しでは、コンパイラは引数の型が大きすぎるという理由でオーバーロードを除外できません。 3 番目のオーバーロードは、1 回目の呼び出しのときと同じ理由で除外されます。2 番目のオーバーロードを呼び出した方が引数の型の拡大変換が少なくて済むからです。 しかし、コンパイラは 1 番目と 2 番目のオーバーロードのいずれかに解決できません。 どちらにも、対応する型に拡大変換されるパラメーター型が 1 つ定義されています (Byte から Short、そして Single から Double)。 このため、オーバーロード解決エラーが生成されます。
オーバーロードされた Optional 引数と ParamArray 引数
プロシージャの 2 つのオーバーロードのシグネチャが同じで、唯一の違いが最後のパラメーターの宣言 (一方が Optional (Visual Basic) で、他方は ParamArray (Visual Basic)) である場合、コンパイラはそのプロシージャの呼び出しを次の方法で解決します。
呼び出しの最後の引数 |
コンパイラがオーバーロードの呼び出しを解決するときの最後の引数の宣言 |
値なし (引数を省略) |
Optional |
単一の値 |
Optional |
コンマで区切られた複数の値のリスト |
ParamArray |
任意の長さの配列 (空の配列を含む) |
ParamArray |
参照
処理手順
プロシージャのトラブルシューティング (Visual Basic)
方法: プロシージャの複数のバージョンを定義する (Visual Basic)
方法: オーバーロードされたプロシージャを呼び出す (Visual Basic)
方法: 省略可能なパラメーターを受け取るプロシージャをオーバーロードする (Visual Basic)
方法: 不特定数のパラメーターを受け取るプロシージャをオーバーロードする (Visual Basic)