0

以下作品:

If 1=1
    rdoYes.checked = True
Else
    rdoNo.checked = True
End If

但是,以下方法不起作用:

IIF(1=1, rdoYes.checked = True, rdoNo.checked = True)

为什么是这样?

谢谢!

4

4 回答 4

7

它确实“工作”;它只是不做你想做的事。

IIf在 VB.NET 中是一个函数永远不要使用它) ,它采用以下参数:

  1. 检查Boolean条件
  2. 如果Object条件是则返回True
  3. Object如果条件是,则返回不同False

在您的使用中,您的条件是1 = 1;那么你的另外两个参数是rdoYes.Checked = Trueand rdoNo.Checked = True,从 VB 编译器的角度来看这两个Boolean表达式(所以,实际上,它们等同于更简单的rdoYes.Checkedand rdoNo.Checked)。

请记住,在 VB.NET 中,如果=符号在其自己的行上,则它只是一个赋值。这就是编译器区分语句的方式,例如和。x = 5If x = 5 Then

这与您的问题没有直接关系,但您也应该知道它IIf已被弃用,您应该几乎总是赞成If

' Let us just suppose it made sense to write this: '
' Notice the If instead of IIf. '
Dim result = If(1 = 1, rdoYes.Checked, rdoNo.Checked)
于 2010-09-13T15:30:57.690 回答
3

IIF()函数将根据您为第一个参数输入的内容返回一些内容。=由于 VB.Net在赋值和=比较之间没有区别(==在许多其他语言中),第二个语句是模棱两可的。


您可以使用后期绑定(VB.Net 中的委托)来做到这一点:

(Function(c) InlineAssignHelper(c.Checked, true)).Invoke(IIf(1 = 1, chkYes, chkNo))

  Private Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
    target = value
    Return value
  End Function
于 2010-09-13T15:23:10.610 回答
1

因为IIf接受表达式并返回其中一个的结果,并且rdoYes.checked = True不是表达式并且不能返回。

于 2010-09-13T15:21:56.230 回答
1

iif没有做你认为它做的事情——重要的是从中获得回报,所以你可以这样做:

iif(1=1, rdoYes, rdoNo).checked = True

(我不确定这是有效的 VB ......自从我不得不在其中编码以来已经有十多年了)

于 2010-09-13T15:26:13.983 回答