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

Bla*_*ise 12 .net c# asp.net-mvc

@{
    ViewBag.Username = "Charlie Brown";
    string title1 = string.Format("Welcome {0}", ViewBag.Username);
    var title2 = string.Format("Welcome {0}", ViewBag.Username);
}
Run Code Online (Sandbox Code Playgroud)

在MVC视图中,我使用如下值:

@Html.ActionLink(title1, "Index")
@Html.ActionLink(title2, "Index")
Run Code Online (Sandbox Code Playgroud)

在这里,title1工作正常.但title2ActionLink因编译错误而失败:

CS1973:'System.Web.Mvc.HtmlHelper'没有名为'StandardHeader'的适用方法,但似乎有一个名称的扩展方法.无法动态分派扩展方法.考虑转换动态参数或调用扩展方法而不使用扩展方法语法.

string.Format()有很多重载,但返回类型总是字符串.为什么变量声明使用var失败?

Pat*_*man 16

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

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

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

dynamic x = "";
int i = string.Format("{0}", x);
Run Code Online (Sandbox Code Playgroud)

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

  • *所有*表达式都在运行时进行计算,偶尔会出现一些编译时文字操作的异常.这不是"动态"特有的.这里推迟的是重载决策,表达式的类型是在运行时确定的.那不一样. (4认同)

Ser*_*rvy 11

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

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

title2是类型的dynamic.你需要把它投射到string,因为你知道它是什么.

  • @David - 如果`ViewBag.Username`是动态的,它将是`dynamic`.`dynamic`适用于整个表达式. (9认同)
  • 值得解释一下*为什么*这里的`title2`的类型是`dynamic`.李给出的解释是这个问题的关键部分,IMO. (7认同)
  • @CodeCaster*如果任何参数是`dynamic`,则每个*方法都可以返回`dynamic`. (3认同)
  • @Servy:Nit pick:如果*参数*是动态的.使*参数*类型`动态`无效. (2认同)

Anw*_*Haq 7

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

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