2012-06-18 9 views
6

Tengo el siguiente código en una página de afeitar CSHTML:¿Por qué falla una instrucción switch en una cadena cuando el valor proviene de ViewBag?

@{ 
    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; 
    } 
} 

Sin embargo, esto está fallando con un mensaje de error del compilador:

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

Pero especie es una cadena! Reescribiendo esto como una serie de declaraciones if/else funciona, pero no es tan elegante.

Respuesta

9

Prueba de conversión, el compilador no conoce el tipo de devolución de ToString() porque es dinámico.

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

OK, eso tiene la menor cantidad de sentido de todo lo que he conocido ... ¡pero funciona! Me gustaría entrar en una discusión filosófica sobre por qué ToString() no solo devuelve una cadena, sino que probablemente no necesito saber ... –

+0

Como es dinámico, el método estará vinculado en tiempo de ejecución, no hay cualquier cosa que detenga una nueva implementación de ToString que devuelva algo que no sea una cadena. Puede usar esto ((objeto) ViewBag.Sort) .ToString() –

+0

¡Por supuesto! Gracias por la explicación y la respuesta rápida. –

Cuestiones relacionadas