C#7在查询子句中不允许使用变量和模式变量声明

Mur*_*ova 3 c# out c#-7.0

为什么在查询子句中不允许输出变量?

如果我在这里使用变量它会失败:

string json = "{'PayDays':['2017-07-07','2017-07-21','2017-08-04','2017-08-18']}";
var pd = JsonConvert.DeserializeObject<Accounting>(json);

var rm = from item in pd.PayDays
     where (DateTime.TryParse(item, out DateTime dateresult)) ?
    dateresult.Subtract(DateTime.Now).Days >= 0 ? true : false : false      
    select item;
rm.Dump();
Run Code Online (Sandbox Code Playgroud)

但老方法有效:

DateTime result;
var rm = from item in pd.PayDays
         where DateTime.TryParse(item, out result) ? (result.Subtract(DateTime.Now).Days >= 0 ? true : false) : false
         select item;
rm.Dump();
Run Code Online (Sandbox Code Playgroud)

Jul*_*eur 8

以下是相关的LDM注释.

结论:

我们没有时间在C#7.0中执行此功能.如果我们希望将来留下自己的空间,我们需要确保我们不允许查询子句中的表达式变量意味着今天的其他东西,这将与这样的未来相矛盾.

当前的语义是查询子句中的表达式变量仅限于查询子句.这意味着两个后续查询子句可以在表达式变量中使用相同的名称.这与允许这些变量跨查询子句边界共享范围的未来不一致.

因此,如果我们希望将来允许这样做,我们必须在C#7.0中加入一些限制来保护设计空间.我们有几个选择:

  • 在查询子句中完全禁止表达式变量
  • 要求给定查询表达式中的所有表达式变量具有不同的名称

前者是一个巨大的锤子,但后者需要做很多工作才能做到 - 而且似乎有可能不会阻挡所有东西.

我们既不会在C#7.0中使用表达式变量也不会解构,而是希望将来能够使用它们.为了保护我们执行此操作的能力,我们将完全禁止查询子句中的表达式变量,即使这是一个相当大的锤子.