2009-10-30 2 views
2

Этот вопрос звучит возмутительно, но VS дает мне ошибку, когда я проверяю, что длина строки больше нуля:В C# проверка длины строки больше нуля приводит к ошибке?

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 и т. Д., Но мы работаем над этим. :)

+6

отправьте всю строку и строку сверху и снизу. – tster

+3

, пожалуйста, разместите окружающий код, чтобы мы могли лучше понять, что происходит. – user10635

+0

Это был заказ операций. + Добавлен в строку до? оценил? –

ответ

9

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

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

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

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

+0

Отличный ответ! Настоящий, который объясняет проблему, а не просто найти обходной путь. Здесь ссылка с приоритетами операторов в .NET: http://msdn.microsoft.com/en-us/library/6a71f45d.aspx – Kamarey

12

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

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

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

+3

Не было бы лучше сделать 'Convert.ToString (options [j] [" pdprice "])' на всякий случай 'options [j] [" pdprice "]' is null? – Bob

+3

@Bob, No. Приведенный выше код отлично обрабатывает нулевые случаи. – mmcdole

+2

Нет, Боб прав. Я думал, что это похоже на набор данных, который обычно использует DBNull. Но нет никакой гарантии, что он имеет и null.ToString() делает исключение. Тем не менее, он, по-видимому, уже протестировал нулевую часть, или он не будет проверять длину. –

2

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

+0

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

+1

@ Lasse - Конечно, проблема всегда в программисте. Но вы ошибаетесь в том, что компилятор не путает, потому что программисты создали компилятор. Я не запутал компилятор C# в последнее время, но я четко помню, как запутался компилятор в прошлом (используя правильный синтаксис). –

Смежные вопросы