2010-12-01 48 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であっても、この場合はIntegerに解析しようとしています。

VS2008を使用している場合は、代わりにIF演算子を使用して、IIFが期待するように短絡させることができます。

+0

実際には「IIf」は機能であり、ただのように振る舞うだけではありません。 –

+0

... 'If'は*演算子*なので関数ではなく+1のように振る舞いません。 – MarkJ

+0

少し微調整します。 – MartW

1

IIfは真の条件演算子ではなく関数呼び出しであり、両方の引数を評価する必要があることを意味します。したがって、文字列がNull/Nothingの場合、Integer.Parse()を呼び出そうとします。

あなたは、Visual Studio 2008以降を使用している場合、それはあなたの問題を解決する唯一の文字の違いです:

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

Ifキーワードのこのバージョンでは、実際に短いことを行います真の条件演算子であります-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))