在我的控制器中的索引操作中,我有这个:
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
为什么这不起作用,我该如何解决这个问题?
答案 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);