vb.net - если выбрасываю странное исключение - PullRequest
3 голосов
/ 31 марта 2011

У меня странная проблема. 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))

Ответы [ 2 ]

9 голосов
/ 31 марта 2011

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

Dim itemLimit As String = If(values.Length < 6, "200", values(5))
1 голос
/ 31 марта 2011

Посмотрите на эту статью: http://www.fmsinc.com/free/newtips/net/nettip33.asp

Из статьи:

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

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

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

...