@{
ViewBag.Username = "Charlie Brown";
string title1 = string.Format("Welcome {0}", ViewBag.Username);
var title2 = string.Format("Welcome {0}", ViewBag.Username);
}
在MVC视图中,我使用如下值:
@Html.ActionLink(title1, "Index")
@Html.ActionLink(title2, "Index")
在这里,title1
工作正常。但title2
ActionLink因编译错误而失败:
CS1973:' System.Web.Mvc.HtmlHelper'没有适用的方法名称' StandardHeader'但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。
string.Format()
有很多重载,但返回类型始终为 string 。为什么使用var
的变量声明在这里失败?
答案 0 :(得分:16)
好的,我们已经从评论和其他答案中知道问题出在dynamic
。由于dynamic
在运行时绑定 ,因此只有在那时才进行重载解析并完成类型验证。
所以:如果至少有一个参数是dynamic
,则重载决议是在运行时完成的。
这就是为什么允许这个明显的错误:
dynamic x = "";
int i = string.Format("{0}", x);
如果string.Format
重载没有返回int
,则不会感到烦恼。它稍后评估。
答案 1 :(得分:11)
错误消息告诉您完全这里有什么错误:
无法动态调度扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。
title2
的类型为dynamic
。您需要将其投放到string
,因为您知道它是什么。
答案 2 :(得分:7)