1

シンプルな 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のようです。(を明示的に変更しても効果はありません)。postParametersDictionary<string, string>varstring

これを修正できる唯一の方法は、 , 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
4

1 に答える 1