Method Overloading อนุญาตให้มีเมธอดชื่อเดียวกันหลายตัว ต่างกันใน Signature (พารามิเตอร์) แต่ Optional Parameters อาจทำให้เกิด Ambiguity (ความคลุมเครือ) ตอน Compile Time
ตัวอย่างที่ทำงานได้ (No Ambiguity)
class Student {
// Optional Parameter: marks2 = 95
static void DisplayMarks(int marks1, int marks2 = 95) {
Console.WriteLine("Method with two parameters (second optional)!");
}
// Optional Parameter: marks1 = 90
static void DisplayMarks(int marks1 = 90) {
Console.WriteLine("Method with one parameter (optional)!");
}
static void Main() {
DisplayMarks(97); // เรียก Overload แรก (marks1=97, marks2=95 default)
// DisplayMarks(); // ❌ Ambiguity! เรียกไหนไม่ชัดเจน
}
}
ตัวอย่างที่เกิด Ambiguity
class Student {
// Overload 1: 2 params, ทั้งคู่ Optional
static void DisplayMarks(int marks1 = 90, int marks2 = 80) {
Console.WriteLine("Two params (both optional)");
}
// Overload 2: 3 params, ตัวสุดท้าย Optional
static void DisplayMarks(int marks1, int marks2 = 80, int marks3 = 98) {
Console.WriteLine("Three params (last optional)");
}
static void Main() {
DisplayMarks(80); // ❌ COMPILE ERROR: Ambiguous!
// Compiler ไม่รู้ว่าเรียก Overload 1 (marks1=80, marks2=80)
// หรือ Overload 2 (marks1=80, marks2=80 default, marks3=98 default)
}
}
วิธีแก้ไข Ambiguity
1. เปลี่ยนชื่อเมธอด (แนะนำ)
static void DisplaySingleMark(int marks1 = 90) { }
static void DisplayTwoMarks(int marks1 = 90, int marks2 = 80) { }
static void DisplayThreeMarks(int marks1, int marks2 = 80, int marks3 = 98) { }
2. ใช้ Named Arguments
DisplayMarks(marks1: 80); // เรียก Overload 1
DisplayMarks(marks1: 80, marks3: 98); // เรียก Overload 2 (ระบุชื่อชัดเจน)
3. ลบ Optional Parameters ออกจาก Overload หนึ่ง
static void DisplayMarks(int marks1, int marks2) { } // Required both
static void DisplayMarks(int marks1, int marks2 = 80, int marks3 = 98) { }
กฎ Ambiguity Resolution (Compiler Logic)
- หา Candidate Methods ที่ Signature Match (รวม Optional Params)
- ถ้ามี > 1 Candidate → Compile Error (Ambiguous)
- Named Arguments ช่วย Disambiguate ได้
Best Practices
- หลีกเลี่ยง Optional Parameters ใน Overloaded Methods
- ใช้ชื่อเมธอดที่สื่อความหมายแทน Overloading มากเกินไป
- ถ้าจำเป็น: ให้ Optional Parameters อยู่ใน Overload ที่มี Parameter น้อยที่สุดเท่านั้น
- ใช้ Named Arguments เมื่อเรียกเพื่อความชัดเจน