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

W widoku MVC używam wartości tak:Dlaczego ten ciąg.Format() zwraca ciąg znaków, ale dynamiczny?

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

Tutaj title1 działa dobrze. Ale title2 actionlink nie powiodło się błąd kompilatora:

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() ma sporo przeciążeń, ale typ zwracany jest zawsze ciąg. Dlaczego deklaracja zmiennej korzystająca z var zawodzi tutaj?

+16

Wątpię, czy otrzymałeś ten komunikat o błędzie z podanego kodu. Podejrzewam, że to trochę inny kod. –

Odpowiedz

16

OK, więc już wiemy z komentarzy i innych odpowiedzi, że problem jest w dynamic. Od dynamic jest związany w środowisku wykonawczym, tylko w tym czasie jest rozdzielczość przeciążania i wykonuje się sprawdzanie poprawności typów.

Tak więc, jeśli przynajmniej jeden z parametrów to dynamic, rozdzielczość przeciążania jest wykonywana w środowisku wykonawczym.

Dlatego to oczywista pomyłka jest dozwolone: ​​

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

To nie przeszkadza, jeśli nie ma string.Format przeciążenie, które zwraca int. Ocenia to później.

+4

* Wszystkie wyrażenia * są oceniane w czasie wykonywania, z wyjątkiem niektórych operacji na literałach czasu kompilacji. Nie dotyczy to 'dynamic'. Odchodzi się tutaj od rozdzielczości przeciążania, a typ wyrażenia jest określany w czasie wykonywania. To jest inne. – Servy

+0

Dobra, nie wiedziałem o tym. Dzięki @Servy –

+0

Cool. To tłumaczy, dlaczego. Dzięki. – Blaise

11

komunikat o błędzie informujący dokładnie co się dzieje tutaj:

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

title2 jest typu dynamic. Musisz go przesłać do string, ponieważ wiesz, że tak właśnie jest.

+2

Ale to nie jest 'dynamic', to' string' ... – David

+0

Ale 'string.Format()' nie zwraca 'dynamic'. – CodeCaster

+9

@David - To będzie 'dynamiczne' jeśli' ViewBag.Username' jest dynamiczne. 'dynamic' odnosi się do całego wyrażenia. – Lee

7

Ta torba widokowa jest dynamiczna. enter image description here

Jeśli użyjesz rzeczywistej nazwy użytkownika (zamiast nazwy ViewBag.UserName), będzie działać. Lub odrzuć (string)ViewBag.Username na ciąg.

Powiązane problemy