三元运算符字符串长度错误

时间:2014-03-25 08:27:26

标签: c# asp.net-mvc

这个错误

ViewBag.description.Length > 160 ? 
    ViewBag.description.Substring(0, 160) : 
    ViewBag.description;

收到此错误

  

类型的例外   ' Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'发生在   System.Core.dll但未在用户代码中处理

     

其他信息:运营商'>'不能应用于操作数   键入' string'和' int'

但它不是一个字符串,因为我正在检查长度?

3 个答案:

答案 0 :(得分:2)

您看到的异常类型为described on MSDN

  

表示在C#运行时中进行动态绑定时发生的错误   粘合剂经过处理。

表示您的某个字段为dynamic。异常详细信息指定代码的Length > 160部分导致问题,其中一个操作数为string,而另一个操作数为int

现在,这是关于dynamic打字的有趣部分;考虑我有以下代码:

dynamic d = 1;
int e = 1;

var length1 = d.Length;
var length2 = e.Length;

ed都保持相同的值,但它们的类型不同。 length1编译得很好,我永远不会发现d在运行时没有Length成员,而length2根本不会编译,因为{{ 1}}没有名为int的成员。

解决方案是在执行Length操作之前显式地转换左右操作数,在这种情况下,将<转换为字符串,并在结果上调用ViewBag.description。 / p>

答案 1 :(得分:1)

尝试使用显式强制转换。如果description是动态的(从您的例外看来),您可能需要强制转换它。如果description字段的类型为string,则可以执行以下操作:

( ((string) ViewBag.description).Length > 160) 
    ? ViewBag.description.Substring(0, 160)
    : (string) ViewBag.description;

我这样做是为了让它更具可读性:

var description = (string) ViewBag.description;

ViewBag.Meta = "Text " + (description.Length > 160 
    ? description.Substring(0, 160)
    : description);

<强>更新即可。 根据{{​​3}}的评论,我根据他的代码添加了完整的作业。

我认为编译器在遇到块"Text " + description.Length时会感到困惑,因为它无法确定后者是三元表达式的一部分 - 也许它被动态混淆了。这可以解释您得到的编译器错误。

圆括号应该解决这个问题,因为它们会对三元运算符强制执行更高的评估优先级。然后,加号运算符将知道它正在执行字符串连接,因为右操作数将是已评估的三元运算符(应该是字符串)。

答案 2 :(得分:0)

你可以试试这个:

 ViewBag.Meta = Convert.ToInt32(ViewBag.description.Length) > 160 ? ViewBag.description.Substring(0, 160) : ViewBag.description;