Почему это не будет работать как функция IIF, а будет как заявление IF? - PullRequest
0 голосов
/ 13 сентября 2010

работают следующие работы:

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

Однако следующее не работает:

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

Почему это?

Спасибо!

Ответы [ 4 ]

7 голосов
/ 13 сентября 2010

Это «работает»;он просто не делает то, что вы хотите.

IIf в VB.NET - это функция ( не используйте ее, когда-либо ,кстати ), который принимает следующие параметры:

  1. A Boolean условие для проверки
  2. An Object для возврата, если условие True
  3. Другой 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)
3 голосов
/ 13 сентября 2010

Функция 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
1 голос
/ 13 сентября 2010

iif не делает то, что, как вы думаете, он делает - важная часть - это возврат от него, поэтому вы можете сделать:

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

(я не уверен, что это действительный VB ... прошло уже более десяти лет, как мне пришлось кодировать в нем)

1 голос
/ 13 сентября 2010

Поскольку IIf принимает выражения и возвращает результат одного из них, а rdoYes.checked = True не является выражением и не может быть возвращено.

...