Asp.net mvc 3 当值来自ViewBag时,为什么字符串上的switch语句会失败?

Asp.net mvc 3 当值来自ViewBag时,为什么字符串上的switch语句会失败?,asp.net-mvc-3,dynamic,razor,Asp.net Mvc 3,Dynamic,Razor,我在CSHTML页面中有以下代码: @{ 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; }

我在CSHTML页面中有以下代码:

@{
    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;
    }
}
但是,此操作失败,并显示编译器错误消息:

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

但排序是一个字符串!将其重写为一系列if/else语句是可行的,但没有那么优雅。

尝试强制转换,编译器不知道ToString()的返回类型,因为它是动态的

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

好吧,这是我所知道的最没有意义的事情。。。但它是有效的!我将进行一次哲学上的讨论,讨论为什么ToString()不只是返回字符串,但我可能不需要知道……因为它是动态的,方法将在运行时绑定,所以没有任何东西可以阻止ToString的新实现返回字符串以外的内容。您可以使用以下((对象)ViewBag.Sort).ToString()