为什么不是这个string.Format()返回字符串,但是动态?

时间:2016-02-12 15:45:46

标签: c# .net asp.net-mvc

@{
    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的变量声明在这里失败?

3 个答案:

答案 0 :(得分:16)

好的,我们已经从评论和其他答案中知道问题出在dynamic。由于dynamic在运行时绑定 ,因此只有在那时才进行重载解析并完成类型验证。

所以:如果至少有一个参数是dynamic,则重载决议是在运行时完成的。

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

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

如果string.Format重载没有返回int,则不会感到烦恼。它稍后评估。

答案 1 :(得分:11)

错误消息告诉您完全这里有什么错误:

  

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

title2的类型为dynamic。您需要将其投放到string,因为您知道它是什么。

答案 2 :(得分:7)

这是一个动态的观景包。 enter image description here

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