Resolusi Overload (Visual Basic)

Saat compiler Visual Basic mengalami panggilan ke prosedur yang ditentukan dalam beberapa versi yang overload, compiler harus memutuskan overload mana yang akan dipanggil. Ini dilakukan dengan melakukan langkah-langkah berikut:

  1. Aksesibilitas. Ini menghilangkan overload dengan tingkat akses yang mencegah kode panggilan memanggilnya.

  2. Jumlah parameter. Ini menghilangkan overload yang menentukan jumlah parameter yang berbeda dari yang disediakan dalam panggilan.

  3. Jenis Data Parameter. Compiler memberikan preferensi metode instans daripada metode ekstensi. Jika ada metode instans yang ditemukan yang hanya memerlukan konversi pelebaran agar sesuai dengan panggilan prosedur, semua metode ekstensi dihilangkan dan compiler hanya berlanjut dengan kandidat metode instans. Jika tidak ada metode instans seperti itu yang ditemukan, metode ini berlanjut dengan metode instans dan ekstensi.

    Dalam langkah ini, ini menghilangkan overload di mana jenis data argumen panggilan tidak dapat dikonversi ke jenis parameter yang ditentukan dalam overload.

  4. Mempersempit Konversi. Ini menghilangkan overload yang memerlukan konversi yang mempersempit dari jenis argumen panggilan ke jenis parameter yang ditentukan. Ini benar apakah sakelar pemeriksaan jenis (Pernyataan Ketat Opsi) adalah On atau Off.

  5. Pelebaran Paling Sedikit. Compiler mempertimbangkan overload yang tersisa secara berpasangan. Untuk setiap pasangan, ini membandingkan jenis data parameter yang ditentukan. Jika jenis di salah satu overload semuanya melebar ke jenis yang sesuai di jenis lainnya, compiler menghilangkan yang terakhir. Artinya, ia mempertahankan overload yang membutuhkan jumlah pelebaran paling sedikit.

  6. Kandidat Tunggal. Ini terus mempertimbangkan overload berpasangan sampai hanya satu overload yang tersisa, dan menyelesaikan panggilan ke overload tersebut. Jika compiler tidak dapat mengurangi overload menjadi satu kandidat, compiler akan menghasilkan kesalahan.

Ilustrasi berikut menunjukkan proses yang menentukan set versi berlebih mana yang akan dipanggil.

Flow diagram of overload resolution process

Contoh berikut mengilustrasikan proses resolusi overload.

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)

Dalam panggilan pertama, compiler menghilangkan overload pertama karena jenis argumen pertama (Short) menyempit ke jenis parameter yang sesuai (Byte). Kemudian menghilangkan overload ketiga karena setiap jenis argumen dalam overload kedua (Short dan Single) melebar ke jenis yang sesuai dalam overload ketiga (Integer dan Single). Overload kedua membutuhkan lebih sedikit pelebaran, sehingga compiler menggunakannya untuk panggilan.

Dalam panggilan kedua, compiler tidak dapat menghilangkan salah satu overload berdasarkan penyempitan. Ini menghilangkan overload ketiga karena alasan yang sama seperti pada panggilan pertama, karena dapat memanggil overload kedua dengan lebih sedikit pelebaran jenis argumen. Namun, compiler tidak dapat menyelesaikan antara overload pertama dan kedua. Masing-masing memiliki satu jenis parameter yang ditentukan yang melebar ke jenis yang sesuai di yang lain (Byte ke Short, tetapi Single ke Double). Oleh karena itu, compiler menghasilkan kesalahan resolusi overload.

Argumen Opsional dan ParamArray yang Overloaded

Jika dua overload prosedur memiliki tanda tangan yang identik kecuali bahwa parameter terakhir dinyatakan Opsional dalam satu dan ParamArray di yang lain, compiler menyelesaikan panggilan ke prosedur tersebut sesuai dengan kecocokan terdekat:

Jika panggilan menyediakan argumen terakhir sebagai Compiler menyelesaikan panggilan ke overload yang mendeklarasikan argumen terakhir sebagai
Tanpa nilai (argumen dihilangkan) Optional
Nilai tunggal Optional
Dua nilai atau lebih dalam daftar yang dipisahkan koma ParamArray
Array dengan panjang apa pun (termasuk array kosong) ParamArray

Lihat juga