Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't this string.Format() return string, but dynamic?

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

In the MVC view I use the values like this:

@Html.ActionLink(title1, "Index")
@Html.ActionLink(title2, "Index")

Here, the title1 works fine. But the title2 ActionLink failed with a compiler error:

CS1973: 'System.Web.Mvc.HtmlHelper' has no applicable method named 'StandardHeader' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.

string.Format() has quite a few overloads, but the return type is always string. Why does the variable declaration using var fail here?

like image 324
Blaise Avatar asked Feb 12 '16 15:02

Blaise


3 Answers

Okay, so we already know from comments and other answers that the problem is in dynamic. Since dynamic is bound on runtime, only at that time is the overload resolution and type validating is done.

So: if at least one of the parameters is dynamic, the overload resolution is done at runtime.

That is why this obvious mistake is allowed:

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

It doesn't bother if there isn't a string.Format overload that returns an int. It evaluates that later on.

like image 107
Patrick Hofman Avatar answered Oct 22 '22 18:10

Patrick Hofman


The error message is telling you exactly what's wrong here:

Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.

title2 is of type dynamic. You need to cast it to string, since you know that's what it is.

like image 11
Servy Avatar answered Oct 22 '22 19:10

Servy


It's the view bag which is dynamic. enter image description here

If you use actual username (instead of ViewBag.UserName)it would work. Or cast (string)ViewBag.Username into string.

like image 7
Anwar Ul-Haq Avatar answered Oct 22 '22 20:10

Anwar Ul-Haq