【问题标题】:Why won't this work as an IIF function, but will as an IF Statement?为什么这不能作为 IIF 函数工作,而是作为 IF 语句工作?
【发布时间】:2010-09-13 15:20:14
【问题描述】:

以下作品:

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

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

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

这是为什么?

谢谢!

【问题讨论】:

标签: asp.net vb.net asp.net-3.5 if-statement iif-function


【解决方案1】:

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

IIf 在 VB.NET 中是一个函数 (don't use it, ever, by the way),它采用以下参数:

  1. 要检查的Boolean 条件
  2. 如果条件为True,则返回一个Object
  3. 如果条件为False,则返回不同的Object

在你的使用中,你的条件是1 = 1;那么你的另外两个参数是rdoYes.Checked = TruerdoNo.Checked = True,从VB 编译器的角度来看,这两个参数都是Boolean 表达式(所以,实际上,它们相当于更简单的rdoYes.CheckedrdoNo.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)

【讨论】:

  • 谢谢丹!非常感谢。
【解决方案2】:

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

【讨论】:

  • 我添加了一个如何在 VB.Net 中实现的示例
  • 我相信它实际上是不是模棱两可的;它 比较(= 符号仅在它本身作为表达式时才被视为赋值)。请注意,OP 的代码确实 compile;它只是没有他想要的。
【解决方案3】:

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

【讨论】:

  • 这是一个表达式,但是VB.Net无法知道你是在比较还是设置值。
  • 你可以通过后期绑定解决这个问题:), `Iif(1=1, Function(f) rdoYes.checke
【解决方案4】:

iif 没有做你认为它做的事——重要的是它的回报,所以你也许可以这样做:

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

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

【讨论】:

  • valid Vb 可能更像 ctype(iif(1=1, rdoYes, rdoNo), radiobutton).checked = true。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
相关资源
最近更新 更多