首页 文章

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

提问于
浏览
4

这有什么不对

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

得到这个错误

System.Core.dll中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的异常但未在用户代码中处理附加信息:运算符'>'不能应用于'string'和'int'类型的操作数

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

3 回答

  • 1

    您看到的异常类型是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 根本不会编译,因为 int 没有名为 Length 的成员 .

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

  • 2

    尝试使用显式强制转换 . 如果 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);
    

    Update . 根据@Dale Fraser的评论,我根据他的代码添加了完整的作业 .

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

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

  • 0

    你能试试这个:

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

相关问题