2016-02-12 8 views
12
@{ 
    ViewBag.Username = "Charlie Brown"; 
    string title1 = string.Format("Welcome {0}", ViewBag.Username); 
    var title2 = string.Format("Welcome {0}", ViewBag.Username); 
} 

In der MVC Ansicht verwende ich die Werte wie folgt aus:Warum gibt String.Format() String zurück, aber dynamisch?

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

Hier ist die title1 funktioniert gut. Aber die title2 Action fehlgeschlagen mit einem Compiler-Fehler:

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() hat einige Überlastungen, aber der Rückgabetyp ist immer String. Warum schlägt die Variablendeklaration mit var hier fehl?

+16

Ich bezweifle, dass Sie diese Fehlermeldung aus dem Code erhalten haben, den Sie angegeben haben. Ich vermute, es ist ein anderer Code. –

Antwort

16

Okay, wir wissen bereits aus Kommentaren und anderen Antworten, dass das Problem in dynamic ist. Seit dynamic ist auf Laufzeit gebunden, nur zu diesem Zeitpunkt ist die Überladung Auflösung und Typ Validierung erfolgt.

Also: Wenn mindestens einer der Parameter dynamic ist, wird die Überladungsauflösung zur Laufzeit ausgeführt.

Deshalb ist dieser offensichtliche Fehler erlaubt ist:

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

Es stört nicht, wenn es nicht eine string.Format Überlastung ist, die ein int zurückgibt. Es wertet das später aus.

+4

* Alle * Ausdrücke werden zur Laufzeit ausgewertet, mit gelegentlicher Ausnahme einiger Operationen auf Kompilierungszeitliteralen. Dies ist nicht spezifisch für "dynamisch". Was hier zurückgestellt wird, ist die Überladungsauflösung und der Typ des Ausdrucks wird zur Laufzeit bestimmt. Das ist anders. – Servy

+0

Okay, wusste das nicht. Danke @Servy –

+0

Cool. Das erklärt, warum. Vielen Dank. – Blaise

11

Die Fehlermeldung sagt Ihnen genau was hier falsch ist:

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

title2 ist vom Typ dynamic. Sie müssen es in string umwandeln, da Sie wissen, dass es das ist.

+2

Aber es ist nicht 'dynamisch', es ist' string' ... – David

+0

Aber 'string.Format()' gibt 'dynamic' nicht zurück. – CodeCaster

+9

@David - Es wird 'dynamisch' wenn' ViewBag.Username' dynamisch ist. 'dynamic' gilt für den gesamten Ausdruck. – Lee

7

Es ist die Sichttasche, die dynamisch ist. enter image description here

Wenn Sie den tatsächlichen Benutzernamen (anstelle von ViewBag.UserName) verwenden, würde es funktionieren. Oder (string)ViewBag.Username in eine Zeichenfolge einbetten.

Verwandte Themen