В C # Проверка длины строки больше нуля приводит к ошибке? - PullRequest
2 голосов
/ 30 октября 2009

Этот вопрос звучит возмутительно, но 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 и т. Д., Но мы работаем над этим. :)

Ответы [ 3 ]

12 голосов
/ 30 октября 2009

Я не уверен, почему вы видите именно эту ошибку. Но я могу сказать, что вы делаете это неправильно. Вот правильный способ проверить наличие пустой строки в .Net:

String.IsNullOrEmpty( options[j]["pdprice"].ToString() )

Обратите внимание, что здесь нигде не используется оператор '>', поэтому, по крайней мере, он может дать вам лучшее сообщение об ошибке.

9 голосов
/ 30 октября 2009

Я рискну предположить, что ваше утверждение о том, что код «слегка изменен для работы», означает, что этот код:

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 во втором коде. Вы переместили конкатенацию строки, где она принадлежит, вместе с другими строками.

Так что ваше небольшое изменение работает, поскольку это правильный способ сделать это, , если вы хотите сохранить эти выражения .

Принятый ответ - гораздо лучшая альтернатива. Моя цель состояла в том, чтобы объяснить вам причину исключения.

2 голосов
/ 30 октября 2009

Ваш опубликованный код не содержит фактического заявления. Таким образом, разумно сделать вывод, что отсутствующий код сбивает с толку компилятор. Убедитесь, что синтаксис кода непосредственно вокруг него правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...