我有以下代码来编写一个简单的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()
?
修改
感谢您的反馈!
要确认这只是一种失常 - VS IDE将变量报告为NULL(在鼠标悬停+立即窗口中), 但只有在使用R#NUnit测试运行器单独调试单元测试时。在控制台App下进行调试在IDE中正确报告值。
即。只有在Resharper NUnit TestRunner下调试时才会发生这种情况。
只要通过更多代码(例如Assert
/ Console.Writeline
等)访问变量,很明显该值实际上不为空。
我添加了console app to GitHub 和screenshot here
所有单元测试都没有实际失败,即该值实际上不为空: - )
答案 0 :(得分:0)
要确认这只是一种失常 - VS IDE将变量报告为NULL(在鼠标悬停+立即窗口中), 但只有在使用R#NUnit测试运行器单独调试单元测试时。在控制台App下进行调试在IDE中正确报告值。
即。只有在Resharper NUnit TestRunner下调试时才会发生这种情况。
只要通过更多代码(例如Assert
/ Console.Writeline
等)访问变量,很明显该值实际上不为空。
我添加了console app to GitHub 和screenshot here
所有单元测试都没有实际失败,即该值实际上不为空: - )