Lý do biên dịch không thành công trong ví dụ là thứ tự của các hoạt động.
Trình phân tích cú pháp biểu thức đang cố gắng đánh giá "dbnull.value hoặc temp" trước.
if temp is (dbnull.value or temp) = 0
Lỗi là ở đây, bởi vì bạn không thể thực hiện một chút HOẶC giữa một số nguyên (tạm thời) và dbnull.value.
OrElse sửa lỗi này, không phải vì nó bị đoản mạch, mà vì nó thấp hơn về thứ tự hoạt động và do đó "temp là dbnull.value" và "3 = 0" đang được đánh giá đầu tiên, thay vì trình phân tích cú pháp cố gắng so sánh dbNull và nhiệt độ.
Vì vậy, đánh giá với OrElse hoạt động như bạn đang mong đợi: (giả sử 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
Đây thực sự là một bài kiểm tra đầu vào tại một công ty phần mềm mà tôi từng làm việc và đó là một vấn đề phổ biến mà tôi từng gặp trong VB6. Vì vậy, bạn nên đặt dấu ngoặc đơn cho các biểu thức con khi sử dụng toán tử boolean:
Điều này sẽ được biên dịch đúng cách:
if (temp is dbnull.value) Or (temp = 0) then
Mặc dù, như mọi người đã chỉ ra, OrElse và AndAlso thực sự là những toán tử chính xác để sử dụng trong ngữ cảnh này.