在条件范围内声明隐式类型变量并在外部使用它

FMF*_*MFF 5 c# foreach var implicit-typing conditional-statements

在下面的简化代码中,

if(city == "New York City")
{
  var MyObject = from x in MyEFTable
                     where x.CostOfLiving == "VERY HIGH"
                     select x.*;

}
else
{
  var MyObject = from x in MyEFTable
                     where x.CostOfLiving == "MODERATE"
                     select x.*;

}

  foreach (var item in MyObject)
  {
     Console.WriteLine("<item's details>");
  }
Run Code Online (Sandbox Code Playgroud)

在条件块之外无法访问变量MyObject.我怎样才能在if..else之外迭代?

Eri*_*ert 24

让我们澄清一下令人困惑的问题.问题是你有两个局部变量,每个变量都有相同的"unspeakable"类型 - 一个匿名类型的序列.

我会改变你的具体代码:

string cost = city == "NYC" ? "HIGH" : "MODERATE";
var query = from row in table 
            where row.Cost == cost 
            select new { row.Population, row.Elevation };
Run Code Online (Sandbox Code Playgroud)

但是,如果由于某种原因仍然需要维护代码的结构,可以这样做:

static IEnumerable<T> SequenceByExample<T>(T t){ return null; }
...
var query = SequenceByExample(new { Population = 0, Elevation = 0.0 } );
if (whatever)
    query = ...
else
    query = ...
Run Code Online (Sandbox Code Playgroud)

这是一个名为"按示例执行"的技巧的变体,其中您将一个匿名类型的示例提供给泛型方法.然后,方法类型推断确定返回类型是什么,并将其用作隐式类型本地的类型.在运行时,它只会创建一个无用的对象,然后快速丢弃.

  • 毫无疑问,这是我一年中见过的最明智的伎俩. (3认同)