นี่คือบั๊กหรือไม่?
ใช่.
ขอแสดงความยินดีคุณพบข้อบกพร่องในการแก้ปัญหาโอเวอร์โหลด ข้อผิดพลาดเกิดขึ้นใน C # 4 และ 5; จะไม่ทำซ้ำในเครื่องวิเคราะห์ความหมายเวอร์ชัน "Roslyn" ฉันได้แจ้งให้ทีมทดสอบ C # 5 ทราบแล้วและหวังว่าเราจะได้รับการตรวจสอบและแก้ไขปัญหานี้ก่อนการเปิดตัวครั้งสุดท้าย (เช่นเคยไม่มีสัญญา)
การวิเคราะห์ที่ถูกต้องมีดังต่อไปนี้ ผู้สมัครคือ:
0: C(params string[]) in its normal form
1: C(params string[]) in its expanded form
2: C<string>(string)
3: C(string, object)
เห็นได้ชัดว่าศูนย์ผู้สมัครไม่สามารถใช้งานได้เนื่องจากstring
ไม่สามารถแปลงเป็นstring[]
. นั่นคือสาม
ในสามวิธีนี้เราต้องกำหนดวิธีการที่ดีที่สุดที่ไม่เหมือนใคร เราทำได้โดยทำการเปรียบเทียบคู่กันของผู้สมัครที่เหลือสามคน มีสามคู่ดังกล่าว ทั้งหมดนี้มีรายการพารามิเตอร์ที่เหมือนกันเมื่อเราตัดพารามิเตอร์ที่เป็นทางเลือกที่ละไว้ออกไปซึ่งหมายความว่าเราต้องไปที่รอบการมัดขั้นสูงที่อธิบายไว้ในส่วน 7.5.3.2 ของข้อกำหนด
อย่างไหนดีกว่า 1 หรือ 2? tiebreaker ที่เกี่ยวข้องคือวิธีการทั่วไปนั้นแย่กว่าวิธีที่ไม่ใช่ทั่วไปเสมอ 2 แย่กว่า 1 ดังนั้น 2 จึงไม่สามารถเป็นผู้ชนะได้
อย่างไหนดีกว่า 1 หรือ 3? tiebreaker ที่เกี่ยวข้องคือ: วิธีการที่ใช้ได้เฉพาะในรูปแบบที่ขยายแล้วจะแย่กว่าวิธีที่ใช้ในรูปแบบปกติเสมอ ดังนั้น 1 จึงแย่กว่า 3 ดังนั้น 1 จึงไม่สามารถเป็นผู้ชนะได้
อย่างไหนดีกว่า 2 หรือ 3? tiebreaker ที่เกี่ยวข้องคือวิธีการทั่วไปนั้นแย่กว่าวิธีที่ไม่ใช่ทั่วไปเสมอ 2 แย่กว่า 3 ดังนั้น 2 จึงไม่สามารถเป็นผู้ชนะได้
ในการได้รับเลือกจากชุดของผู้สมัครที่เกี่ยวข้องหลายคนผู้สมัครจะต้อง (1) ไม่แพ้ใคร (2) เอาชนะผู้สมัครคนอื่นอย่างน้อยหนึ่งคนและ (3) เป็นผู้สมัครที่ไม่ซ้ำกันซึ่งมีคุณสมบัติสองประการแรก ผู้สมัครคนที่สามไม่แพ้ผู้สมัครคนอื่นและเอาชนะผู้สมัครคนอื่นอย่างน้อยหนึ่งคน เป็นผู้สมัครเพียงรายเดียวที่มีคุณสมบัตินี้ ดังนั้นผู้สมัครที่สามเป็นผู้สมัครที่ดีที่สุดที่ไม่ซ้ำกัน มันควรจะชนะ
ไม่เพียง แต่คอมไพเลอร์ C # 4 จะทำงานผิดพลาด แต่คุณสังเกตถูกต้องว่ามันกำลังรายงานข้อความแสดงข้อผิดพลาดที่แปลกประหลาด การที่คอมไพลเลอร์ได้รับการวิเคราะห์ความละเอียดเกินพิกัดนั้นผิดพลาดเล็กน้อย การที่ได้รับข้อความแสดงข้อผิดพลาดนั้นไม่น่าแปลกใจเลย ข้อผิดพลาดฮิวริสติก "วิธีการที่คลุมเครือ" โดยทั่วไปจะเลือกวิธีการสองวิธีจากชุดผู้สมัครหากไม่สามารถกำหนดวิธีการที่ดีที่สุดได้ มันไม่ค่อยดีนักในการค้นหาความคลุมเครือ "ของจริง" หากในความเป็นจริงมีอยู่
คนหนึ่งอาจถามว่าทำไมถึงเป็นเช่นนั้น มันค่อนข้างยุ่งยากในการหาสองวิธีการที่ "คลุมเครือ unambigously" เพราะ "betterness" ความสัมพันธ์เป็นกรรม เป็นไปได้ที่จะเกิดสถานการณ์ที่ผู้สมัคร 1 ดีกว่า 2, 2 ดีกว่า 3 และ 3 ดีกว่า 1 ในสถานการณ์เช่นนี้เราไม่สามารถทำได้ดีไปกว่าการเลือกสองคนเป็น "คนที่ไม่ชัดเจน"
ฉันต้องการปรับปรุงฮิวริสติกนี้สำหรับ Roslyn แต่มีความสำคัญต่ำ
(แบบฝึกหัดสำหรับผู้อ่าน: "ประดิษฐ์อัลกอริทึมเชิงเส้นเวลาเพื่อระบุสมาชิกที่ดีที่สุดที่ไม่ซ้ำกันของชุดขององค์ประกอบ n ที่ความสัมพันธ์ที่ดีกว่าเป็นอกรรมกริยา" เป็นหนึ่งในคำถามที่ฉันถูกถามในวันที่ฉันสัมภาษณ์ทีมนี้ไม่ใช่ อัลกอริทึมที่ยากมากลองยิงดูสิ)
สาเหตุหนึ่งที่เราผลักดันการเพิ่มอาร์กิวเมนต์ที่เป็นทางเลือกให้กับ C # เป็นเวลานานคือจำนวนสถานการณ์ที่คลุมเครือที่ซับซ้อนซึ่งแนะนำในอัลกอริทึมการแก้ปัญหาโอเวอร์โหลด เห็นได้ชัดว่าเราทำไม่ถูก
หากคุณต้องการป้อนปัญหาการเชื่อมต่อเพื่อติดตามปัญหาโปรดอย่าลังเลที่จะ หากคุณเพียงแค่ต้องการให้เราทราบก็ถือว่าเสร็จสิ้น ฉันจะติดตามการทดสอบในปีหน้า
ขอขอบคุณที่แจ้งเรื่องนี้ให้ฉันทราบ ขออภัยในความผิดพลาด
'Overloaded.ComplexOverloadResolution(string)'
หมายถึง<string>(string)
วิธีการนี้ ฉันคิดว่ามันหมายถึง(string, object)
วิธีการที่ไม่มีวัตถุให้มา