Я рискну предположить, что ваше утверждение о том, что код «слегка изменен для работы», означает, что этот код:
newlistitem.Value = options[j][valuefield].ToString() +
((options[j]["pdprice"].ToString().Length > 0 ) ?
"/" + options[j]["pdprice"].ToString() : "" );
на самом деле выглядело так:
newlistitem.Value = options[j][valuefield].ToString() +
options[j]["pdprice"].ToString().Length > 0 ?
"/" + options[j]["pdprice"].ToString() : "";
(обратите внимание на пропущенные скобки)
Причина, по которой этот код выдаст эту ошибку, заключается в том, что из-за приоритета оператора будет вычислено следующее:
String a = options[j][valuefield].ToString();
Int32 b = options[j]["pdprice"].ToString().Length;
String c = a + b;
Boolean d = c > 0;
String e = "/" + options[j]["pdprice"].ToString();
String f = "";
newlistitem.value = d ? e : f;
При таком взгляде a+b
создаст новую строку, поскольку добавление чего-либо в строку преобразует это в строку для конкатенации. По сути, «xyz» + 3 дает «xyz3».
Добавляя круглые скобки, ваше «небольшое изменение», вы по существу переписали код, чтобы сделать это:
String a = options[j][valuefield].ToString();
String b = options[j]["pdprice"].ToString().Length;
Boolean c = b > 0; <-- this is different
String d = "/" + options[j]["pdprice"].ToString();
String e = "";
String f = c ? d : e;
String g = a + f; <-- and this
newlistitem.value = g;
Обратите внимание на разницу между d
в первом коде и c
во втором коде. Вы переместили конкатенацию строки, где она принадлежит, вместе с другими строками.
Так что ваше небольшое изменение работает, поскольку это правильный способ сделать это, , если вы хотите сохранить эти выражения .
Принятый ответ - гораздо лучшая альтернатива. Моя цель состояла в том, чтобы объяснить вам причину исключения.