vb.net - IIf выдает странное исключение

У меня странная проблема. IIf портится, когда я работаю с массивом. По-видимому, он проверяет мой оператор else, даже если он не активирован. Вот некоторый код, демонстрирующий проблему:

'works
 Dim test As String = "bleh"
 If values.Length < 6 Then
   test = "200"
 Else
   test = values(5)
 End If

 'throws indexoutofrange exception
 Dim itemLimit As String = IIf(values.Length < 6, "200", values(5))

person Phil    schedule 30.03.2011    source источник
comment
Какую версию VisualStudio вы используете?   -  person Pondidum    schedule 31.03.2011
comment
Я использую Microsoft Visual Basic 2010 Express.   -  person Phil    schedule 31.03.2011
comment
возможный дубликат Используя VB.NET IIF, я получаю NullReferenceException   -  person MarkJ    schedule 21.02.2012


Ответы (2)


Оператор Iif не реализует короткое замыкание и будет оценивать как истинный, так и ложный случай. Если вам нужна версия с коротким замыканием, используйте If.

Dim itemLimit As String = If(values.Length < 6, "200", values(5))
person JaredPar    schedule 30.03.2011
comment
Спасибо! Вы указали проблему и решение. Мой единственный вопрос: в чем смысл IIF, если он оценивает как истинный, так и ложный случай? - person Phil; 31.03.2011
comment
@Phil IIf существует как минимум с VB 7 (первоначальный выпуск VB.Net). В то время VB не реализовывал короткое замыкание для большинства своих конструкций (на самом деле And/Or не замыкаются). Эта функция была разработана в то время и, следовательно, не добавляла логику короткого замыкания. - person JaredPar; 31.03.2011

Взгляните на эту статью: http://www.fmsinc.com/free/newtips/net/nettip33.asp

Из статьи:

Visual Basic, VBA и Visual Basic .NET поддерживают функцию IIF в качестве альтернативы оператору If...Then...Else. Хотя это может показаться упрощением, IIF работает иначе, чем If...Then...Else.

IIF должен оценивать все утверждение при подготовке аргумента, что может привести к нежелательным побочным эффектам.

Другими словами, ваш If...Then...Else работает, потому что предложение Else не оценивается, если условие не выполняется. С другой стороны, IIf оценивает все операторы, вызывая исключение IndexOutOfBounds.

person Ender    schedule 30.03.2011