1

私はこのコードを持っています:

Dictionary<string, object> tempDict = new Dictionary<string, object>();

if(xDicionary.TryGetValue(...., out tempDict)
{
tempDict.Add(...);
}
else
{
tempDict.Add(..);
}

コードがelseブロックに渡された場合、tempDictがnullを指しているため、追加を実行できない例外が発生しました。なぜこうなった ?新しい辞書をelseブロックにも割り当てることで醜い方法でそれをバイパスする方法を知っていますが、これを行うより良い方法はありますか?

4

5 に答える 5

3

パラメータを持つメソッドは、outパラメータに値を割り当てる必要outがあるためです。つまり、呼び出すxDicionary.TryGetValue tempDictと常に上書きされ、何も見つからない場合は null に設定されます。したがって、else では常にnull になりますtempDict

于 2011-12-10T12:43:05.377 に答える
1

TryGetValueパラメータを使用するため、このように動作しoutます。パラメーターには常にメソッドのout値が割り当てられるため、パラメーターを初期化すると上書きされます。

ドキュメントでは、次のように述べてこの点を指摘しています。

このパラメーターは初期化されずに渡されます。

したがって、一時的に使用する必要があります。

于 2011-12-10T12:41:22.790 に答える
1

TryGetValuetempDict値を取得できなかったnull場合は false を返し、 を設定します。

これは、呼び出されるメソッドでoutパラメーターを確実に割り当てる必要があり、値の型に対して値を再試行できない場合に、値を割り当てる論理的な既定値nullであるために発生します。

TryGet*これは、すべての BCLメソッドの通常のセマンティクスです。

于 2011-12-10T12:41:59.620 に答える
0

tempDict = new ... を else {} ブロック内に配置する必要があります。TryGetValue が false を返す場合、out パラメーターの値を信頼することはできません。

于 2011-12-10T12:44:11.823 に答える
0

xDictionary要求された値が含まれていない場合は がTryGetValue返さfalseれ、out値が に設定されるためnullです。したがって、Add何かをしようとすると、nullが得られますNullReferenceException

于 2011-12-10T12:42:09.277 に答える