Share via


オーバーロードの解決法

更新 : 2007 年 11 月

オーバーロードされたバージョンが複数定義されているプロシージャが呼び出された場合、Visual Basic のコンパイラは、どのオーバーロードを呼び出すのかを判断する必要があります。この判断は、次の手順で行われます。

  1. **アクセシビリティ。**呼び出し元のコードから呼び出すことができないアクセス レベルを持つオーバーロードを除外します。

  2. **パラメータの数。**呼び出しで指定されている数と異なる数のパラメータが定義されているオーバーロードを除外します。

  3. **パラメータのデータ型。**コンパイラは、拡張メソッドよりインスタンス メソッドを優先します。インスタンス メソッドが、プロシージャの呼び出しに一致するためには拡大変換のみが必要だと判断された場合、すべての拡張メソッドはドロップされ、コンパイラはインスタンス メソッドの候補のみに対して操作を続行します。このようなインスタンス メソッドが見つからなかった場合には、インスタンス メソッドと拡張メソッドの両方に対して操作が続行されます。

    呼び出し元の引数のデータ型を定義されているパラメータ型に変換できないオーバーロードが、ここで除外されます。

  4. **縮小変換。**呼び出し元の引数の型から定義されているパラメータの型への縮小変換が必要なオーバーロードを除外します。これは型チェックのスイッチ (Option Strict ステートメント) が On でも Off でも同じです。

  5. **最小の拡大。**残りのオーバーロードをペアと見なします。各ペアごとに、定義されているパラメータのデータ型を比較します。一方のオーバーロードのすべての型がもう一方のオーバーロードの対応する型に拡大変換される場合は、後者を除外します。つまり、拡大変換が最も少なくて済むオーバーロードが残されます。

  6. **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) である場合、コンパイラはそのプロシージャの呼び出しを次の方法で解決します。

呼び出しの最後の引数

コンパイラがオーバーロードの呼び出しを解決するときの最後の引数の宣言

値なし (引数を省略)

Optional

単一の値

Optional

コンマで区切られた複数の値のリスト

ParamArray

任意の長さの配列 (空の配列を含む)

ParamArray

参照

処理手順

プロシージャのトラブルシューティング

方法 : プロシージャの複数のバージョンを定義する

方法 : オーバーロードされたプロシージャを呼び出す

方法 : 省略可能なパラメータを受け取るプロシージャをオーバーロードする

方法 : 不特定数のパラメータを受け取るプロシージャをオーバーロードする

概念

省略可能なパラメータ

パラメータ配列

プロシージャのオーバーロード

プロシージャのオーバーロードに関する注意事項

拡張メソッド (Visual Basic)

参照

Overloads