0

実行時にエラーが発生する理由を誰かに教えてもらえますか?

Dim mightBeNothing As List(Of String) = Nothing
Dim a As List(Of String) = IIf(mightBeNothing Is Nothing, New List(Of String)(), New List(Of String)(mightBeNothing))

私はArgumentNullException2行目に乗っています。最後の部分を次のように置き換えた場合:

Dim a As List(Of String) = IIf(mightBeNothing Is Nothing, New List(Of String)(), New List(Of String)())

それは機能しますが、何もないNew List(Of String)(mightBeNothing)場合はコンストラクターが呼び出されることはありません。問題は何ですか?mightBeNothing

4

3 に答える 3

2

IIf関数は短絡評価を使用しません。したがって、mightBeNothingが何もない場合でも、常にすべてを評価します。

この件に関するMSDN

于 2012-01-31T01:20:56.067 に答える
1

まず、コレクション初期化子はVB.NET10より前ではサポートされていません。

そうは言っても、最初の例は3番目の引数にnull(Nothing)値を渡すことです。IIf関数は、最初の引数の真/偽の状態に関係なく、常に3つの引数すべてを評価します。それがあなたが受け取っている理由だと思いますArgumentNullException

2番目のケースでは、どの引数もNothingそうではないので機能しますが、望ましい結果は得られません。

IfElseを使用することをお勧めします。

Dim mightBeNothing As List(Of String) = Nothing
Dim a As List(Of String)

If mightBeNothing Is Nothing Then
    a = New List(Of String)
Else
    a = New List(Of String)
    a.Add(mightBeNothing)
End If
于 2012-01-31T01:23:53.480 に答える
1

IIFの代わりにIF演算子を使用してみてください。ショートします。MSDNのこの記事を参照してください

于 2012-01-31T01:30:22.710 に答える