为什么这个string.Format()没有返回字符串,而是动态的?

@{ 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()有很多重载,但返回类型总是字符串 。 为什么使用var的变量声明在这里失败?

好的,所以我们已经从评论和其他答案中知道问题是dynamic 。 由于dynamic绑定在运行时 ,因此只有在那个时候才能完成重载解析和类型validation。

因此:如果至少有一个参数是dynamic ,则重载决策在运行时完成。

这就是为什么允许这个明显的错误:

 dynamic x = ""; int i = string.Format("{0}", x); 

如果没有返回intstring.Format重载,则不会打扰。 它稍后评估。

错误消息告诉您这里到底出了什么问题:

无法动态分派扩展方法。 考虑转换动态参数或调用扩展方法而不使用扩展方法语法。

title2dynamic类型。 你需要将它转换为string ,因为你知道它是什么。

它是动态的视图包。 在此处输入图像描述

如果您使用实际的用户名(而不是ViewBag.UserName),它将起作用。 或者将(string)ViewBag.Username转换为字符串。