以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  BUG收集  (http://foxtable.net/bbs/list.asp?boardid=12)
----  iif的bug探析  (http://foxtable.net/bbs/dispbbs.asp?boardid=12&id=38607)

--  作者:ztmdnzc
--  发布时间:2013/8/2 12:37:00
--  iif的bug探析

Dim Vals() As String = e.Node.Fullname.Split(".") \'用fullname,分隔符为"."
Dim Filter As String = "[DXCS] = \'" & Vals(0) & "\' And [文件大小] = \'" & Vals(1) & "\'"
Dim drs As List(Of DataRow) = DataTables("pc").Select(filter,"修改时间")
Dim va As Short=vals(0)

情况一:

出错的代码:vals(0)=1 时,第一个MessageBox能够执行,后三个MessageBox出错,=2时,后两个出错,=3时,最后一个出错。

If va<=4 Then
   MessageBox.Show(iif(va>=1,drs(4*va-4)("文件名") & "| " & drs(4*va-4)("修改时间") & "| " & drs(4*va-4)("文件大小"),""))
   MessageBox.Show(iif(va>=2,drs(4*va-3)("文件名") & "| " & drs(4*va-3)("修改时间") & "| " & drs(4*va-3)("文件大小"),""))
   MessageBox.Show(iif(va>=3,drs(4*va-2)("文件名") & "| " & drs(4*va-2)("修改时间") & "| " & drs(4*va-2)("文件大小"),""))
    messageBox.Show(iif(va=4,drs(4*va-1)("文件名") & "| " & drs(4*va-1)("修改时间") & "| " & drs(4*va-1)("文件大小"),""))
End If

 

情况二:

改成如下代码,vals(0)=1 ,2,3,4时,全部能够执行。

If va<=4 Then

      MessageBox.Show(iif(va>=1,drs(4*va-4)("文件名") & "| " & drs(4*va-4)("修改时间") & "| " & drs(4*va-4)("文件大小"),""))
      MessageBox.Show(iif(va>=2,"t","w"))

      MessageBox.Show(iif(va>=3,"t","w"))
      MessageBox.Show(iif(va>=4,"t","w"))
End If

 

参考帮助,iif在条件不成立时情况一中应该等于"",在情况二中等于w,情况二能够执行,情况一却出错,其原因是在条件不成立时iif却仍对drs(4*va-3)("文件名") & "| " & drs(4*va-3)("修改时间") & "| " & drs(4*va-3)("文件大小")进行运算,而不是直接等于"",情况二中t,w是不需要运算的,所以能够执行。

根据以上分析,iif存在条件不成立时仍对truevalue进行运算而不是直接等于falsevalue的bug,建议狐爸改进。


--  作者:有点甜
--  发布时间:2013/8/2 18:59:00
--  
 iif函数的特性就是这样的,无论是否成立,都会对表达式进行求值的。

 如果有特殊的需要,可以改用if else 语句代替。