如何在C#中重用"var"声明的变量

Cha*_*erQ 2 c# linq var

我想要实现的是:

switch(flag)
{
    case 1:
          var query=from w in db.someTable
                    select w;
          break;
    case 2:
          query=from w in db.someTable
                    where w.id==someID
                    select w;
          break;
    case default:
          break;
}
Run Code Online (Sandbox Code Playgroud)

但它无法正确编译.如果我var在第二个之前添加一个query,它会提示已声明查询.我是否必须更改变量名称?如:像query1 in case1, query2 in case2


编辑1感谢您的帮助.实际上我的代码比我上面发布的代码复杂一点.这是完整的代码:

List<object> results=new List<object>();
switch (flag)
{
    case 1:
    var query = from w in db.RADIATION
    where w.DATEDT.CompareTo(dateStr) == 0
    && w.LATITUDE.CompareTo(latitude) == 0
    && w.LONGITUDE.CompareTo(longitude) == 0
    orderby w.TIMETM
    select new { w.RADIATION, w.TIMETM };
    break;
    case 2:
    var query = from w in db.TEMPRETURE
    where w.DATEDT.CompareTo(dateStr) == 0
    && w.LATITUDE.CompareTo(latitude) == 0
    && w.LONGITUDE.CompareTo(longitude) == 0
    orderby w.TIMETM
    select new { w.TEMPRETURE, w.TIMETM };
    foreach (var item in query)
    {
        var resultItem = new { TEMPRETURE = item.TEMPRETURE, TIME = item.TIMETM };
        results.Add(resultItem);
    }
    break;
    case default:
    break;
}
Run Code Online (Sandbox Code Playgroud)

这两个查询用于两个不同的表.所以我不知道如何确定IQueryable中的Type T. 另外,我使用的select是匿名对象new { PropertyName = propertyValue }.无论如何,如果我坚持使用相同的名称query

das*_*ght 5

使用声明var可以缩短代码,但声明的变量仍然是静态类型的,并且该变量的范围不会更改.

如果需要在外部使用变量switch,请在switch语句之前声明它,如下所示:

IQueryable<SomeType> query = null;
switch (...) {
    case 1: query = ...; break;
    ...
    default: ...
}
Run Code Online (Sandbox Code Playgroud)

现在你可以query在外面使用了switch.

注意:在某些情况下您必须使用,var因为您为其分配的类型没有名称,但在第一种情况下,类型具有名称,因此您无需使用var.

编辑:但是,你的第二种情况需要一个var,因为你选择了一个匿名类型.在这种情况下,有几种方法可以解决这个问题:

  • 你可以声明一个名为类型您选择列"超"(即TIMETM,TEMPERATURERADIATION),或
  • 在.NET 4.0中,您可以使用IQueryable<dynamic>.这会将一些编译时检查转移到运行时,但如果你必须走这条路,那就非常方便了.