Этот вопрос звучит возмутительно, но VS дает мне ошибку, когда я проверяю, что длина строки больше нуля:
options[j]["pdprice"].ToString().Length > 0
Высказывание:
CS0019: Оператор ' > ' не может применяться к операндам типа 'string' и 'int'
Может кто-нибудь объяснить, почему я не могу проверить, что свойство целочисленной длины больше нуля? Я даже попробовал отличить все как int, но он все еще жалуется.
EDIT:
Мне нравится ответ ниже и изменит код. Это оригинал, слегка измененный для "работы":
newlistitem.Value = options[j][valuefield].ToString() +
((options[j]["pdprice"].ToString().Length > 0 ) ?
"/" + options[j]["pdprice"].ToString() : "" );
И да, это ссылка на старый DataSet. У нас не было времени для преобразования решения в MVC, Linq и т.д., Но мы работаем над этим.:)
Я собираюсь опасаться, что ваше утверждение о том, что код "слегка изменен для работы" означает, что этот код:
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
во втором коде. Вы переместили конкатенацию строки, где она принадлежит, вместе с другими строками.
Итак, ваша небольшая модификация работает, так как это правильный способ сделать это, , если вы хотите сохранить эти выражения.
Принятый ответ является гораздо лучшей альтернативой. Моя цель состояла в том, чтобы дать вам объяснение причины исключения.
Я не уверен, почему вы видите эту конкретную ошибку. Но я могу сказать, что вы делаете это неправильно. Здесь правильный способ проверить пустую строку в .Net:
String.IsNullOrEmpty( options[j]["pdprice"].ToString() )
Обратите внимание, что это не использует оператор " > " в любом месте, поэтому, по крайней мере, он может дать вам лучшее сообщение об ошибке.
Convert.ToString(options[j]["pdprice"])
на тот случай, если options[j]["pdprice"]
имеет значение null?
Ваш опубликованный код не содержит фактического оператора. Поэтому нам разумно заключить, что недостающий код путает компилятор. Убедитесь, что синтаксис кода непосредственно вокруг него правильный.