อะไรทำให้เกิดปัญหานี้
ดูเหมือนว่าคอมไพเลอร์บั๊กสำหรับฉัน อย่างน้อยก็ทำได้ แม้ว่านิพจน์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พารามิเตอร์เท่านั้น