สาเหตุที่การคอมไพล์ล้มเหลวในตัวอย่างคือ ลำดับของการดำเนินการ
โปรแกรมแยกวิเคราะห์นิพจน์กำลังพยายามประเมิน "dbnull.value หรือ temp" ก่อน
if temp is (dbnull.value or temp) = 0
ข้อผิดพลาดอยู่ที่นี่เนื่องจากคุณไม่สามารถทำบิตหรือระหว่างจำนวนเต็ม (temp) และ dbnull.value ได้
OrElse แก้ไขปัญหานี้ไม่ใช่เพราะไฟฟ้าลัดวงจร แต่เป็นเพราะลำดับการทำงานต่ำกว่าดังนั้น "temp คือ dbnull.value" และ "3 = 0" จึงได้รับการประเมินก่อนแทนที่จะเป็นตัววิเคราะห์ที่พยายามเปรียบเทียบ dbNull และ อุณหภูมิ
ดังนั้นการประเมินด้วย OrElse จึงทำงานได้อย่างที่คุณคาดหวัง: (สมมติว่า temp = 3)
if temp is dbnull.value OrElse temp = 0 then
if 3 is dbnull.value OrElse 3 = 0 then
if false OrElse 3=0 then
if false OrElse false then
if false then
จริงๆแล้วนี่เป็นการสอบเข้า บริษัท ซอฟต์แวร์ที่ฉันเคยทำงานและเป็นปัญหาทั่วไปที่ฉันเคยพบใน VB6 ดังนั้นคุณควรวงเล็บนิพจน์ย่อยของคุณเมื่อใช้ตัวดำเนินการบูลีน:
สิ่งนี้จะได้รวบรวมอย่างถูกต้อง:
if (temp is dbnull.value) Or (temp = 0) then
แม้ว่าตามที่ทุกคนได้ชี้ให้เห็นแล้ว OrElse และ AndAlso เป็นตัวดำเนินการที่ถูกต้องที่จะใช้ในบริบทนี้