Зачем мне нужен явный 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
кажется, всегда ноль, независимо от того,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()
когда внутри условного оператора?
редактировать
Спасибо за ответ!
Чтобы подтвердить, что это всего лишь заблуждение - VS IDE сообщает о переменной как NULL (при наведении мыши + Немедленное окно), но только при индивидуальной отладке модульных тестов с помощью средства запуска R # NUnit. При отладке под консолью приложение правильно сообщает значение в IDE.
то есть это происходит только при отладке в Resharper NUnit TestRunner.
Как только к переменной будет получен доступ с помощью дополнительного кода (например, /Assert
Console.Writeline
и т. д.), ясно, что значение на самом деле не равно нулю.
мы добавиликонсольное приложение для GitHub искриншот здесь
Ни один из модульных тестов фактически не проходит, то есть значение isn 'на самом деле ноль :-)
R # 7.1.3 C # Edition (2224)NUnit 2.6.1.12217