为什么即使IF条件不满足也会命中IF条件?

时间:2021-03-22 11:52:52

标签: asp.net .net vb.net

我有这个代码

订单类型 = 10

但它仍然进入第一个 IF 块,但它不应该。

   OrderType_ID = ViewState("v_OrderTypeID")

    If OrderType_ID <> 7 & OrderType_ID <> 8 & OrderType_ID <> 9 & OrderType_ID <> 10 Then

        If OrderType_ID = 1 & OrderType_ID = 2 & OrderType_ID = 3 Then

            GenerateInvoiceNo_DebitCreditNote(False)   '' Credit note

        ElseIf OrderType_ID = 4 & OrderType_ID = 5 & OrderType_ID = 6 Then

            GenerateInvoiceNo_DebitCreditNote(True)   '' Debit note

        End If

    Else
        GenerateInvoiceAndDocNumber()
    End If

1 个答案:

答案 0 :(得分:1)

要修复您拥有的代码,它应该是这样的:

OrderType_ID = ViewState("v_OrderTypeID")

If OrderType_ID <> 7 AndAlso
   OrderType_ID <> 8 AndAlso
   OrderType_ID <> 9 AndAlso
   OrderType_ID <> 10 Then
    If OrderType_ID = 1 OrElse
       OrderType_ID = 2 OrElse
       OrderType_ID = 3 Then
        GenerateInvoiceNo_DebitCreditNote(False)   '' Credit note
    ElseIf OrderType_ID = 4 OrElse
           OrderType_ID = 5 OrElse
           OrderType_ID = 6 Then
            GenerateInvoiceNo_DebitCreditNote(True)   '' Debit note
    End If
Else
    GenerateInvoiceAndDocNumber()
End If

请注意,您不仅没有使用实际的布尔运算符,而且还尝试在需要布尔 AND 运算符的地方使用布尔 OR 运算符。 OrderType_ID 怎么可能同时等于 1、2 和 3?

也就是说,有一个更好的方法。执行此操作的“正确”方法是使用 Select Case 语句:

Select Case OrderType_ID
    Case 1 To 3
        GenerateInvoiceNo_DebitCreditNote(False)
    Case 4 To 6
        GenerateInvoiceNo_DebitCreditNote(True)
    Case 7 To 10
        GenerateInvoiceAndDocNumber()
End Select

如果 OrderType_ID 不可能是 1 到 10 以外的值,或者您也想对其他值做同样的事情,那么您不必明确说明最后一种情况:

Select Case OrderType_ID
    Case 1 To 3
        GenerateInvoiceNo_DebitCreditNote(False)
    Case 4 To 6
        GenerateInvoiceNo_DebitCreditNote(True)
    Case Else
        GenerateInvoiceAndDocNumber()
End Select