Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Overloaded Method และ Ambiguity (ความคลุมเครือ) ใน C#

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)

  1. หา Candidate Methods ที่ Signature Match (รวม Optional Params)
  2. ถ้ามี > 1 Candidate → Compile Error (Ambiguous)
  3. Named Arguments ช่วย Disambiguate ได้

Best Practices

  • หลีกเลี่ยง Optional Parameters ใน Overloaded Methods
  • ใช้ชื่อเมธอดที่สื่อความหมายแทน Overloading มากเกินไป
  • ถ้าจำเป็น: ให้ Optional Parameters อยู่ใน Overload ที่มี Parameter น้อยที่สุดเท่านั้น
  • ใช้ Named Arguments เมื่อเรียกเพื่อความชัดเจน