อะไรทำให้เกิดปัญหานี้
ดูเหมือนว่าคอมไพเลอร์บั๊กสำหรับฉัน อย่างน้อยก็ทำได้ แม้ว่านิพจน์decimal.TryParse(v, out a)
และdecimal.TryParse(v, out b)
จะได้รับการประเมินแบบไดนามิก แต่ฉันคาดว่าคอมไพเลอร์จะยังคงเข้าใจว่าเมื่อถึงเวลาที่กำหนดa <= b
ทั้งสองอย่างa
และb
ได้รับมอบหมายอย่างแน่นอน แม้จะมีความแปลกประหลาดที่คุณสามารถทำได้ในการพิมพ์แบบไดนามิกฉันคาดหวังว่าจะประเมินa <= b
หลังจากประเมินการTryParse
โทรทั้งสองครั้งแล้วเท่านั้น
อย่างไรก็ตามปรากฎว่าด้วยตัวดำเนินการและการแปลงที่ยุ่งยากมันเป็นไปได้ทั้งหมดที่จะมีนิพจน์A && B && C
ที่ประเมินค่าA
และC
แต่ไม่ใช่B
- หากคุณมีไหวพริบเพียงพอ ดูรายงานข้อบกพร่องของ Roslynสำหรับตัวอย่างอันชาญฉลาดของ Neal Gafter
การทำให้งานdynamic
นั้นยากขึ้นไปอีก - ความหมายที่เกี่ยวข้องเมื่อตัวถูกดำเนินการเป็นแบบไดนามิกนั้นอธิบายได้ยากกว่าเนื่องจากในการดำเนินการแก้ปัญหาโอเวอร์โหลดคุณจำเป็นต้องประเมินตัวถูกดำเนินการเพื่อดูว่าประเภทใดที่เกี่ยวข้องซึ่งสามารถตอบโต้ได้ง่าย อย่างไรก็ตามอีกครั้งโอนีลได้เกิดขึ้นกับตัวอย่างที่แสดงให้เห็นว่าข้อผิดพลาดคอมไพเลอร์จะต้องเ ... นี้ไม่ได้เป็นข้อผิดพลาดก็เป็นข้อผิดพลาดการแก้ไข ความรุ่งโรจน์จำนวนมากต่อโอนีลเพื่อพิสูจน์มัน
เป็นไปได้ไหมที่จะแก้ไขผ่านการตั้งค่าคอมไพเลอร์
ไม่ แต่มีทางเลือกอื่นที่หลีกเลี่ยงข้อผิดพลาด
ประการแรกคุณสามารถหยุดไม่ให้เป็นแบบไดนามิก - หากคุณรู้ว่าคุณจะใช้สตริงเพียงอย่างเดียวคุณสามารถใช้IEnumerable<string>
หรือกำหนดตัวแปรช่วงv
เป็นประเภทstring
(เช่นfrom string v in array
) ได้ นั่นจะเป็นตัวเลือกที่ฉันต้องการ
หากคุณต้องการให้ไดนามิกจริงๆเพียงแค่ให้b
ค่าเริ่มต้นด้วย:
decimal a, b = 0m;
สิ่งนี้จะไม่ทำอันตรายใด ๆ - เรารู้ดีว่าจริงๆแล้วการประเมินแบบไดนามิกของคุณจะไม่ทำอะไรที่บ้าคลั่งดังนั้นคุณจะยังคงกำหนดค่าให้b
ก่อนที่คุณจะใช้มันทำให้ค่าเริ่มต้นไม่เกี่ยวข้อง
นอกจากนี้ดูเหมือนว่าการเพิ่มวงเล็บก็ใช้ได้เช่นกัน:
where decimal.TryParse(v, out a) && (decimal.TryParse("15", out b) && a <= b)
นั่นจะเปลี่ยนจุดที่ทริกเกอร์ความละเอียดโอเวอร์โหลดชิ้นต่างๆและเกิดขึ้นเพื่อทำให้คอมไพเลอร์พอใจ
นอกจากนี้หนึ่งในปัญหาที่ยังเหลือ - กฎข้อมูลจำเพาะของที่ได้รับมอบหมายที่ชัดเจนกับ&&
ความต้องการผู้ประกอบการที่จะชี้แจงให้กับรัฐที่พวกเขาใช้เฉพาะเมื่อ&&
ผู้ประกอบการจะถูกนำมาใช้ในการดำเนินงานของ "ปกติ" มีสองbool
ตัวถูกดำเนินการ ฉันจะพยายามทำให้แน่ใจว่าสิ่งนี้ได้รับการแก้ไขสำหรับมาตรฐาน ECMA ถัดไป
b
หลังจากกำหนดผ่านout
พารามิเตอร์เท่านั้น