VB.NET: входная строка была в неправильном формате - PullRequest
1 голос
/ 01 декабря 2010

Со следующим фрагментом

Foo = IIf(String.IsNullOrEmpty(txtFoo.Text), 0, Integer.Parse(txtFoo.Text.Trim))

Я получаю сообщение об ошибке при отправке поля без значения: «Входная строка была в неправильном формате.»У меня нет пробела или чего-то еще, и String.IsNullOrEmpty (txtFoo.Text) возвращает true.Что случилось?Спасибо.

Ответы [ 4 ]

5 голосов
/ 01 декабря 2010

IIF будет оценивать:

Integer.Parse(txtFoo.Text.Trim) 

независимо от того, является ли:

String.IsNullOrEmpty(txtFoo.Text) 

истинным или нет (поскольку это просто функция с тремя переданными аргументамипоэтому все аргументы должны быть действительными).Таким образом, даже если txtFoo.text is empty, в этом случае он все еще пытается разобрать его в целое число.

Если вы используете VS2008, вы можете использовать вместо этого оператор IF, который будет закорачивать, как вы ожидаетеИИФ делать.

1 голос
/ 01 декабря 2010

IIf не является истинным троичным оператором, на самом деле он вычисляет оба выражения параметра. Вы, вероятно, хотите использовать вместо этого оператор If (VS 2008 +).

Вы бы просто сказали

If(String.IsNullOrEmpty(txtFoo.Text), 0, Integer.Parse(txtFoo.Text.Trim()))
1 голос
/ 01 декабря 2010

IIf - это вызов функции, а не истинный условный оператор, и это означает, что оба аргумента должны быть оценены. Таким образом, он просто пытается вызвать Integer.Parse (), если ваша строка имеет значение Null / Nothing.

Если вы используете Visual Studio 2008 или более позднюю версию, разница в одном символе может решить вашу проблему:

Foo = If(String.IsNullOrEmpty(txtFoo.Text), 0, Integer.Parse(txtFoo.Text.Trim())

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

Если вы используете Visual Studio 2005 или более раннюю версию, исправьте это следующим образом:

If String.IsNullOrEmpty(txtFoo.Text) Then Foo = 0 Else Foo = Integer.Parse(txtFoo.Text.Trim())
0 голосов
/ 01 декабря 2010

Одно из различий между условной и остальной частью заключается в обрезке строки. Вы можете попробовать обрезать строку перед вызовом IsNullOrEmpty.

Foo = IIf(String.IsNullOrEmpty(txtFoo.Text.Trim), 0, Integer.Parse(txtFoo.Text.Trim))
...