В C # Проверка длины строки больше нуля приводит к ошибке?

2

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

  • 6
    пожалуйста, разместите всю строку и строку выше и ниже.
  • 3
    пожалуйста, опубликуйте окружающий код, чтобы мы могли лучше понять, что происходит.
Показать ещё 2 комментария
Теги:
string

3 ответа

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

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

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

  • 0
    Отличный ответ! Реальный, который объясняет проблему, а не просто найти обходной путь. Вот ссылка с приоритетом операторов в .NET: msdn.microsoft.com/en-us/library/6a71f45d.aspx
12

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

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

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

  • 3
    Не лучше ли использовать Convert.ToString(options[j]["pdprice"]) на тот случай, если options[j]["pdprice"] имеет значение null?
  • 3
    @Bob, Нет. Приведенный выше код прекрасно обрабатывает нулевые случаи.
Показать ещё 4 комментария
2

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

  • 0
    Обратите внимание, что невозможно спутать компилятор. У компилятора есть строгие правила синтаксиса, которых он придерживается, и он никогда не будет сбит с толку, за исключением случаев, когда вы просите его разрешить идентификаторы, имеющие несколько значений. В этих случаях компилятор будет жаловаться. Но он никогда не будет сбит с толку и делать неправильные вещи, он всегда будет делать правильные вещи. Проблема всегда в программисте.
  • 1
    @Lasse - Конечно, проблема всегда в программисте. Но вы ошибаетесь в том, что невозможно спутать компилятор - потому что программисты создали компилятор. В последнее время я не путал компилятор C #, но я хорошо помню, как в прошлом сбивали с толку компиляторы (используя правильный синтаксис).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню