名为'myList'的局部变量不能在此范围内声明

时间:2013-05-12 17:54:52

标签: c# asp.net-mvc sorting

任何人都可以向我解释一下这个错误是什么以及我为什么会这样做? 我试图更改名称f变量,但它不起作用。

public ActionResult Index(string SortOrder, string CurrentFilter, string SearchString, int? page)
{

    ViewBag.CurrentSort = SortOrder;
    ViewBag.NameSortParm = string.IsNullOrEmpty(SortOrder) ? "Tillverkning desc" : "";
    ViewBag.DateSortParm = SortOrder == "HireDate" ? "HireDatedesc" : "HireDate";

    conn.Open();

    ProductionOrderList myList = new  ProductionOrderList();
    myList = ProductionOrderReg.GetProductionOrders(conn, new Guid("288937bcc-6uif-485a-anm9-fadfq1234039d"));

    if (!string.IsNullOrEmpty(SearchString))
    {     
        // here on myList get red line     
        myList = myList.Where( myList => myList .ProductionOrderNo.ToUpper().Contains(SearchString.ToUpper()));
    }
}

2 个答案:

答案 0 :(得分:4)

这是因为C#支持closures。编译器抱怨,因为lambda参数myList必须具有与外部作用域中的任何变量不同的名称。

试试这个:

myList = myList.Where(x => x.ProductionOrderNo.ToUpper().Contains(SearchString.ToUpper()));

请参阅Lambda Expressions (C# Programming Guide)


您遇到的下一个问题是,myList的类型为ProductionOrderList,而Where则返回IEnumerable<T>。除非您需要使用自定义集合类型,否则我不会使用它。试试这个:

 IEnumerable<tionOrderItem> myList = ProductionOrderReg.GetProductionOrders(...);
 if (!string.IsNullOrEmpty(SearchString))
 {     
      // here on myList get red line     
      myList = myList.Where(x => x .ProductionOrderNo.ToUpper().Contains(SearchString.ToUpper()));
 }

 ...

或者,你真的必须使用ProductionOrderList的实例,确保你有一个带IEnumerable<T>的构造函数,并使用它:

 ProductionOrderList myList = ProductionOrderReg.GetProductionOrders(...);
 if (!string.IsNullOrEmpty(SearchString))
 {     
      // here on myList get red line     
      myList = new ProductionOrderList(
          myList.Where(x => x .ProductionOrderNo.ToUpper().Contains(SearchString.ToUpper())));
 }

答案 1 :(得分:1)

将您的代码更改为

myList = myList.Where( item => item .ProductionOrderNo.ToUpper().Contains(SearchString.ToUpper()));