views:

76

answers:

4

The following works:

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

However, the following doesn't work:

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

Why is this?

Thanks!

+1  A: 

Because IIf takes expressions and returns a result of one of them, and rdoYes.checked = True is not an expression and cannot be returned.

wRAR
It is an expression, but VB.Net can't know if you're comparing or setting the value.
Tomas Lycken
You can solve this by late binding :), `Iif(1=1, Function(f) rdoYes.checke
Jan Jongboom
+3  A: 

The IIF() function will return something based on what you enter for the first parameter. Since VB.Net doesn't differ between = as in assignment and = as in comparison (== in many other languages), the second statement is ambiguous.


You can do this with using late binding (delegates in 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
Tomas Lycken
I added an example how this cán be achieved in VB.Net
Jan Jongboom
I believe it's actually *not* ambiguous; it **is** the comparison (the `=` symbol is only ever treated as assignment when it is by itself as an expression). Notice that the OP's code does *compile*; it just doesn't *do* what he wants.
Dan Tao
+1  A: 

iif doesn't do what you think it does -- the important part is the return from it, so you might be able to do:

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

(I'm not sure that's valid VB ... it's been more than a decade since I've had to code in it)

Joe
valid Vb would probably be more like ctype(iif(1=1, rdoYes, rdoNo), radiobutton).checked = true. Thanks :)
Curt
+5  A: 

It does "work"; it just doesn't do what you want.

IIf in VB.NET is a function (don't use it, ever, by the way), which takes these parameters:

  1. A Boolean condition to check
  2. An Object to return if the condition is True
  3. A different Object to return if the condition is False

In your usage, your condition is 1 = 1; then your two other parameters are rdoYes.Checked = True and rdoNo.Checked = True, both Boolean expressions from the VB compiler's perspective (so, really, they're equivalent to the simpler rdoYes.Checked and rdoNo.Checked).

Remember that in VB.NET, the = sign is only an assignment if it is on its own line. This is how the compiler distinguishes between statements such as x = 5 and If x = 5 Then.

This is not directly related to your question, but you should also be aware that IIf is deprecated and you should almost always favor If instead:

' 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)
Dan Tao
Thanks Dan! Much appreciated.
Curt