2012-06-18 3 views
6

Ich habe den folgenden Code in einer CSHTML Rasierapparat Seite:Warum schlägt eine switch-Anweisung für eine Zeichenfolge fehl, wenn der Wert von ViewBag stammt?

@{ 
    var sort = ViewBag.Sort.ToString(); 
    switch (sort) 
    { 
     case "None": Html.Action("SortNone"); break; 
     case "Name": Html.Action("SortName"); break; 
     case "Date": Html.Action("SortDate"); break; 
    } 
} 

Dies ist jedoch mit einer Compiler-Fehlermeldung Fehler:

CS0151: A switch expression or case label must be a bool, char, string, integral, enum, or corresponding nullable type 

Aber Art ist ein String! Das umschreiben als eine Reihe von if/else-Anweisungen, ist aber nicht so elegant.

Antwort

9

Versuchen Sie, Casting, der Compiler kennt nicht den Rückgabetyp von ToString(), weil es dynamisch ist.

var sort = (string)ViewBag.Sort.ToString(); 
+1

OK, das macht den geringsten Sinn für alles, was ich je gewusst habe ... aber es funktioniert! Ich würde in eine philosophische Diskussion darüber gehen, warum ToString() nicht nur eine Zeichenkette zurückgibt, aber ich muss wahrscheinlich nicht wissen ... –

+0

Weil es dynamisch ist, wird die Methode zur Laufzeit gebunden, gibt es nicht alles, was eine neue Implementierung von ToString stoppt, die etwas anderes als eine Zeichenfolge zurückgibt. Du könntest das verwenden ((Objekt) ViewBag.Sort) .ToString() –

+0

Natürlich! Danke für die Erklärung und schnelle Antwort. –

Verwandte Themen