为什么这不能作为IIF函数,而是作为IF语句?
-
02-10-2019 - |
题
以下工作:
If 1=1
rdoYes.checked = True
Else
rdoNo.checked = True
End If
但是,以下内容无效:
IIF(1=1, rdoYes.checked = True, rdoNo.checked = True)
为什么是这样?
谢谢!
解决方案
它确实是“工作”;它只是不做您想要的。
IIf
在vb.net中 功能 (不要使用它, 曾经, , 顺便一提),采用这些参数:
- 一种
Boolean
检查条件 - 一个
Object
如果条件是True
- 不同的
Object
如果条件是False
在您的用法中,您的病情是 1 = 1
;那么您的其他两个参数是 rdoYes.Checked = True
和 rdoNo.Checked = True
, , 两个都 Boolean
从VB编译器的角度来看(实际上,它们等同于更简单的表达式) rdoYes.Checked
和 rdoNo.Checked
).
请记住,在vb.net中 =
标志是 只要 作业 如果是自己的线. 。这就是编译器如何区分诸如诸如的陈述 x = 5
和 If 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)
其他提示
这 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
因为 IIf
取得表达并返回其中一个的结果,并 rdoYes.checked = True
不是表达,不能返回。
iif
不做您认为的事情 - 重要的部分是从中回报,因此您可能能够做到:
iif(1=1, rdoYes, rdoNo).checked = True
(我不确定这是有效的VB ...自从我必须在其中编码已经有十多年了)
不隶属于 StackOverflow