使用变量外部switch语句+ asp.net mvc

时间:2013-12-20 13:37:43

标签: c# asp.net asp.net-mvc variables

在我的控制器中的索引操作中,我有这个:

public ActionResult Index(string sortOrder)
{
    var model;
    ViewBag.CitySortParm = String.IsNullOrEmpty(sortOrder) ? "City_desc" : "";
    switch (sortOrder)
    {
        case "City_desc":
            model = this.UnitOfWork.AddressRepository.Get().OrderBy(a => a.City);
            break;
    }
    return View(model);
}

这不起作用,我总是收到错误:Implicitly-typed local variables must be initialized

为什么这不起作用,我该如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

  

为什么这不起作用

有两个原因:

  • 您尝试使用var而未指定初始值。你不能这样做 - 编译器无法推断出类型。
  • 如果model 不是 sortOrder,您试图在City_desc变量初始化时尝试阅读sortOrder变量被退回?那种类型会是什么?
  

我该如何解决这个问题?

这取决于City_desc不是model时您想要发生什么。计算出你想要返回的价值,并确保它已被退回。

基本上,在明确分配之前,你无法读取局部变量 - 换句话说,直到编译器能够(通过C#规则)证明当你到达那里时,它将被分配一个值。

就隐式输入而言 - 您是否总是会为视图使用相同的类型?如果是这样,只需显式声明switch的类型,以及修复明确的赋值部分。如果没有,我会考虑在 case / model语句中返回 - 我认为你的{{1}}局部变量实际上对你没有多大帮助。< / p>

答案 1 :(得分:3)

第一个问题是,如果您只是使用model声明var model;变量,则无法推断出model变量的类型。

您应该明确声明其类型。

此外,正如Jon Skeet正确指出的那样,您必须在return ...电话之前以某种方式初始化model。如果sortOrder不是“City_desc”,请试着想象{{1}}的价值是什么......

答案 2 :(得分:1)

  

必须初始化隐式类型的局部变量

是的,必须内联初始化才能使其正常工作。

var model = default(MyType);//This should work

或者只是明确声明类型。

MyType model = default(MyType);//Or null if it is a reference type

答案 3 :(得分:1)

在使用之前,必须初始化隐式声明的变量。一个简单的例子:

var x;

if(true)
    x = "true";

这会给你带来同样的错误。这应该是hapening:

var x = "";

if(true)
    x = "true";

您的代码也一样。在使用之前初始化它。假设您的模型属于AddressViewModel类型,那么这应该有效:

var model = new AddressViewModel();
ViewBag.CitySortParm = String.IsNullOrEmpty(sortOrder) ? "City_desc" : "";
switch (sortOrder)
{
    case "City_desc":
        model = this.UnitOfWork.AddressRepository.Get().OrderBy(a => a.City);
        break;
}
return View(model);