为什么在使用条件运算符时需要显式的ToString()?

时间:2013-09-26 11:22:05

标签: c# linq conditional-operator

我有以下代码来编写一个简单的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"

但是,当我将它包装在条件运算符中进行空检查时,如下所示:

     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;

resultWhenInConditional似乎始终为null,无论postParameters是设置为null还是设置为有效Dictionary<string, string>。 (将var更改为显式string也无效。

我可以解决此问题的唯一方法是在ToString()之后添加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测试运行器单独调试单元测试时。在控制台App下进行调试在IDE中正确报告值。

即。只有在Resharper NUnit TestRunner下调试时才会发生这种情况。

只要通过更多代码(例如Assert / Console.Writeline等)访问变量,很明显该值实际上不为空。

我添加了console app to GitHubscreenshot here

所有单元测试都没有实际失败,即该值实际上不为空: - )

  • R#7.1.3 C#Edition(2224)
  • NUnit 2.6.1.12217

1 个答案:

答案 0 :(得分:0)

要确认这只是一种失常 - VS IDE将变量报告为NULL(在鼠标悬停+立即窗口中), 但只有在使用R#NUnit测试运行器单独调试单元测试时。在控制台App下进行调试在IDE中正确报告值。

即。只有在Resharper NUnit TestRunner下调试时才会发生这种情况。

只要通过更多代码(例如Assert / Console.Writeline等)访问变量,很明显该值实际上不为空。

我添加了console app to GitHubscreenshot here

所有单元测试都没有实际失败,即该值实际上不为空: - )

  • R#7.1.3 C#Edition(2224)
  • NUnit 2.6.1.12217