Зачем нужен явный ToString () при использовании условного оператора?

У меня есть следующий код для составления простого значения данных формы SOAP Post:

var postParameters = new Dictionary { { "someNumber", "100" }, { "someString", "Hello World" } }; var resultWhenNotInConditional = postParameters .Keys .Zip(postParameters.Values, (key, value) => string.Format("{0}={1}", key, value)) .Aggregate(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(null, (prev, next) => (prev != null) ? string.Format("{0}&{1}", prev, next) : next) : string.Empty; 

resultWhenInConditional как представляется, всегда имеет значение null, независимо от того, установлено значение postParameters null или действительный Dictionary . (Изменение переменной var на явную string также не влияет).

Единственное, что я могу исправить, это добавить ToString() после Aggregate , а именно:

  var resultWhenInConditional = (postParameters != null) ? postParameters .Keys .Zip(postParameters.Values, (key, value) => string.Format("{0}={1}", key, value)) .Aggregate(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 test runner. Отладка под консольным приложением сообщает правильное значение в среде IDE.

т.е. это происходит только при отладке под Resharper NUnit TestRunner.

Как только переменная получает доступ к следующему коду (например, Assert / Console.Writeline т. Д.), Console.Writeline ясно, что значение NOT фактически не равно нулю.

Я добавил консольное приложение для GitHub и скриншот здесь

Ни один из модульных тестов не работает, т. Е. Значение на самом деле не равно null 🙂

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

Чтобы подтвердить, что это всего лишь аберрация, VS IDE сообщает переменную как NULL (в наведении мыши + немедленное окно), но только тогда, когда отладка модуля тестируется индивидуально с помощью R # NUnit test runner. Отладка под консольным приложением сообщает правильное значение в среде IDE.

т.е. это происходит только при отладке под Resharper NUnit TestRunner.

Как только переменная получает доступ к следующему коду (например, Assert / Console.Writeline т. Д.), Console.Writeline ясно, что значение NOT фактически не равно нулю.

Я добавил консольное приложение для GitHub и скриншот здесь

Ни один из модульных тестов не работает, т. Е. Значение на самом деле не равно null 🙂

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