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

Zac*_*ott 2 c# string

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

options[j]["pdprice"].ToString().Length > 0
Run Code Online (Sandbox Code Playgroud)

他说:

CS0019:运算符'>'不能应用于'string'和'int'类型的操作数

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

编辑:

我喜欢下面的答案,并将更改代码.这是原来略微修改为"工作":

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

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

Joe*_*orn 12

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

String.IsNullOrEmpty( options[j]["pdprice"].ToString() )
Run Code Online (Sandbox Code Playgroud)

请注意,这不会在任何地方使用">"运算符,因此至少它可能会为您提供更好的错误消息.

  • 做`Convert.ToString(options [j] ["pdprice"])`是不是更好?以防万一`options [j] ["pdprice"]`为空? (3认同)
  • @Bob,不.上面的代码处理空案例就好了. (3认同)
  • 不,鲍勃是对的.我认为它看起来像一个数据集,通常使用DBNull.但是不能保证他拥有的东西和null.ToString()会抛出异常.尽管如此,他可能已经测试了零件,或者他不会检查.Length. (2认同)

ang*_*son 9

我将冒险猜测你的声明代码"稍微修改为工作"意味着这段代码:

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

实际上看起来像这样:

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

(注意缺少的括号)

代码产生此错误的原因是由于运算符优先级,将评估的是:

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;
Run Code Online (Sandbox Code Playgroud)

通过这种查看方式,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;
Run Code Online (Sandbox Code Playgroud)

注意d第一个代码和c第二个代码之间的区别.您已将字符串的串联移动到其所属的位置以及其他字符串.

因此,如果您想要保留这些表达式,那么您的轻微修改就会起作用,因为它是正确的方法.

接受的答案是一个更好的选择.我的目标是向您解释异常的原因.