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"

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

     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 还是设置为 valid ,resultWhenInConditional似乎始终为 null 。(将 更改为显式也没有效果)。postParametersDictionary<string, string>varstring

我可以解决这个问题的唯一方法是在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 专业版 2010 版本 10.0.40219.1 SP1Rel
  • Microsoft .NET 框架版本 4.0.30319 SP1Rel

编辑

感谢您的反馈!

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

即这仅在调试时发生,在 Resharper NUnit TestRunner 下。

一旦变量被进一步的代码(例如Assert/Console.Writeline等)访问,很明显该值实际上不是空的。

我在GitHub 中添加了一个控制台应用程序, 并在此处添加了屏幕截图

没有一个单元测试实际上失败,即该值实际上不是 null :-)

  • R# 7.1.3 C# 版 (2224)
  • NUnit 2.6.1.12217
4

1 回答 1

0

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

即这仅在调试时发生,在 Resharper NUnit TestRunner 下。

一旦变量被进一步的代码(例如Assert/Console.Writeline等)访问,很明显该值实际上不是空的。

我在GitHub 中添加了一个控制台应用程序, 并在此处添加了屏幕截图

没有一个单元测试实际上失败,即该值实际上不是 null :-)

  • R# 7.1.3 C# 版 (2224)
  • NUnit 2.6.1.12217
于 2014-01-02T19:50:24.107 回答