シンプルな SOAP Post フォーム データ値を構成する次のコードがあります。
var postParameters = new Dictionary<string, string>
{
{ "someNumber", "100" },
{ "someString", "Hello World" }
};
var resultWhenNotInConditional =
postParameters
.Keys
.Zip(postParameters.Values,
(key, value) => string.Format("{0}={1}", key, value))
.Aggregate<string, string>(null,
(prev, next) =>
(prev != null)
? string.Format("{0}&{1}", prev, next)
: next);
設計どおりに機能する、つまり
resultWhenNotInConditional = "someNumber=100&someString=Hello World"
ただし、これを条件演算子でラップして null チェックを行うと、次のようになります。
var resultWhenInConditional =
(postParameters != null)
? postParameters
.Keys
.Zip(postParameters.Values,
(key, value) => string.Format("{0}={1}", key, value))
.Aggregate<string, string>(null,
(prev, next) =>
(prev != null)
? string.Format("{0}&{1}", prev, next)
: next)
: string.Empty;
が null に設定されているか有効な に設定されているresultWhenInConditional
かに関係なく、 は常に nullのようです。(を明示的に変更しても効果はありません)。postParameters
Dictionary<string, string>
var
string
これを修正できる唯一の方法は、 , vizToString()
の後に追加することです:Aggregate
var resultWhenInConditional =
(postParameters != null)
? postParameters
.Keys
.Zip(postParameters.Values,
(key, value) => string.Format("{0}={1}", key, value))
.Aggregate<string, string>(null,
(prev, next) =>
(prev != null)
? string.Format("{0}&{1}", prev, next)
: next)
.ToString() // R# warns this is redundant
: string.Empty;
.ToString()
だから私の質問は、条件演算子の中に追加する必要があるのはなぜですか?
- Microsoft Visual Studio Professional 2010 バージョン 10.0.40219.1 SP1Rel
- Microsoft .NET Framework バージョン 4.0.30319 SP1Rel
編集
フィードバックをお寄せいただきありがとうございます!
これが異常であることを確認するために、VS IDE は変数を (マウス ホバー + イミディエイト ウィンドウで) NULL として報告していますが、これは R# NUnit テスト ランナーを使用して単体テストを個別にデバッグする場合のみです。コンソール アプリでデバッグすると、IDE で値が正しく報告されます。
つまり、これは、Resharper NUnit TestRunner の下でデバッグするときにのみ発生します。
変数がさらにコード ( Assert
/Console.Writeline
など) によってアクセスされるとすぐに、値が実際には null ではないことが明らかになります。
コンソール アプリを GitHub に追加し 、スクリーンショットをここに追加しました
実際に失敗する単体テストはありません。つまり、値は実際には null ではありません :-)
- R# 7.1.3 C# 版 (2224)
- NUnit 2.6.1.12217