2010-12-01 4 views
1

다음 스 니펫과 함께VB.NET : 입력 문자열이 올바른 형식이 아닙니다.

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

값없이 필드를 제출하면 오류가 발생합니다. "입력 문자열의 형식이 올바르지 않습니다." 공간이나 다른 것이 없으며 String.IsNullOrEmpty (txtFoo.Text)가 true를 반환합니다. 뭐가 잘못 되었 니? 감사합니다.

답변

5

IIF 평가됩니다

Integer.Parse(txtFoo.Text.Trim) 

을에 관계없이 여부 :

String.IsNullOrEmpty(txtFoo.Text) 

이 (사실인지 아닌지 그것을 전달 세 개의 인수와 단지 함수로, 그래서 모든 인수가해야 유효하다). 따라서 txtFoo.text is empty 일지라도이 경우 정수로 파싱을 시도합니다.

VS2008을 사용하는 경우 IIF가 예상하는 것처럼 IF 회로를 사용하여 회로를 단락시킬 수 있습니다.

+0

실제로 'IIf'는 기능이며, 단지 하나처럼 행동하지 않습니다. –

+0

... 그리고'If'는 * 연산자 *이므로 함수가 아니며 +1처럼 동작하지 않습니다. – MarkJ

+0

약간 조정했습니다. – MartW

1

IIf는 진정한 조건부 연산자가 아니라 함수 호출이므로 두 인수를 모두 평가해야 함을 의미합니다. 따라서 문자열이 Null/Nothing이면 Integer.Parse()를 호출하려고 시도합니다.

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

If 키워드의이 버전은 실제로 짧은을 할 것입니다 진정한 조건 연산자입니다 :

당신의 문제를 해결하기 위해 하나 개의 문자 차이를 당신은 비주얼 스튜디오 2008을 사용하고있는 이상, 그것은 단지의 경우 -circuit 예상대로 인수를 평가합니다.

Visual Studio 2005를 사용하는 경우 또는 이전, 당신은 이런 식으로 문제를 해결 :

If String.IsNullOrEmpty(txtFoo.Text) Then Foo = 0 Else Foo = Integer.Parse(txtFoo.Text.Trim()) 
1

하여 IIf 진정한 삼항 연산자 아니라, 실제로 모두 매개 변수 표현식을 평가합니다. 대신 If 연산자를 사용하려고합니다 (VS 2008 이상).

당신은 단순히 조건과 "다른"부분 사이

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

한 가지 차이점은 문자열의 트리밍 말할 것입니다. IsNullOrEmpty을 호출하기 전에 문자열을자를 수 있습니다.

Foo = IIf(String.IsNullOrEmpty(txtFoo.Text.Trim), 0, Integer.Parse(txtFoo.Text.Trim)) 
관련 문제