为什么IIf与If / Then / EndIf的工作方式不同?

时间:2017-05-22 23:09:18

标签: vb.net

有人可以帮助我理解为什么If / Then / End If有效但IIf没有?

我用这个运行我的代码,它按预期工作:

For Each BtnObj In Padre.Controls
  With BtnObj
    If nullinator(.Tag) = 0 Then
      .Visible = False
    Else
      .Visible = True
    End If
  End With
Next

这是我的“nullinator”函数:

Public Shared Function nullinator(ByVal CheckVal As String) As Integer
    ' Receives a string and returns an integer (zero if Null or Empty or original value)
    If String.IsNullOrEmpty(CheckVal) Then
        Return 0
    Else
        Return CheckVal
    End If
End Function

但是,如果我使用此代码运行它,即使Tag属性的内容为空,nullinator(.Tag)= 0也始终等于False。这是代码:

For Each BtnObj In Padre.Controls
    With BtnObj
        IIf(nullinator(.Tag) = 0, .Visible = False, .Visible = True)
    End With
Next

哦,是的,“Padre”变量是容器(父)对象。

为什么我没有成功使用IIf的任何见解将不胜感激!

2 个答案:

答案 0 :(得分:2)

IIf返回一个值:

.Visible = IIf(nullinator(.Tag) = 0, False, True)
  

返回两个对象中的一个,具体取决于表达式的评估。

https://msdn.microsoft.com/en-us/library/27ydhh0d(v=vs.90).aspx

为什么返回Object并将其作为参数,而不是任何其他数据类型:

  

(对象)保存引用对象的32位(4字节)地址。您可以将任何引用类型(字符串,数组,类或接口)分配给Object变量。 Object变量还可以引用任何值类型的数据(数字,布尔值,字符,日期,结构或枚举)。 (强调我自己)

通过允许函数采用任何值类型,不需要函数重载。

https://msdn.microsoft.com/en-us/library/twcxd6b8(v=vs.90).aspx

答案 1 :(得分:0)

...因为您认为的任务实际上是比较。

IIF函数返回一个值。因此,它将返回.Visible = False.Visible = True的结果。

要使其有效,您可能希望删除比较并返回TrueFalse