这个错误
ViewBag.description.Length > 160 ?
ViewBag.description.Substring(0, 160) :
ViewBag.description;
收到此错误
类型的例外 ' Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'发生在 System.Core.dll但未在用户代码中处理
其他信息:运营商'>'不能应用于操作数 键入' string'和' int'
但它不是一个字符串,因为我正在检查长度?
答案 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;
e
和d
都保持相同的值,但它们的类型不同。 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;