在C#中,检查字符串长度是否大于零会产生错误?

时间:2009-10-30 18:19:05

标签: c# string

这个问题听起来很冒犯,但当我检查字符串长度是否大于零时,VS给我一个错误:

options[j]["pdprice"].ToString().Length > 0

话说:

  

CS0019:运营商'>'不能应用于'string'和'int'

类型的操作数

有人可以解释为什么我无法检查整数长度属性是否大于零?我甚至尝试将整个事件作为int进行投射,但它仍然抱怨。

编辑:

我喜欢下面的答案,并会更改代码。这是原来稍微修改为“工作”:

newlistitem.Value = options[j][valuefield].ToString() + 
((options[j]["pdprice"].ToString().Length > 0 ) ?  
"/" + options[j]["pdprice"].ToString() : "" );

是的,它引用了一个旧的DataSet。我们没有时间将解决方案转换为MVC,Linq等,但我们正在努力。 :)

3 个答案:

答案 0 :(得分:12)

我不确定你为什么会看到这个特殊的错误。但我可以说你做错了。这是在.Net中检查空字符串的正确方法:

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

请注意,这不使用'>'操作员在任何地方,所以至少它可能会给你一个更好的错误信息。

答案 1 :(得分: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是一个更好的选择。我的目标是向您解释异常的原因。

答案 2 :(得分:2)

您发布的代码不包含实际声明。因此,我们可以得出结论,缺少代码会使编译器混乱。确保紧邻其周围的代码语法正确。