这个问题听起来很冒犯,但当我检查字符串长度是否大于零时,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等,但我们正在努力。 :)
答案 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)
您发布的代码不包含实际声明。因此,我们可以得出结论,缺少代码会使编译器混乱。确保紧邻其周围的代码语法正确。