c# - C# 中 lambda 变量的作用域是什么?

标签 c# lambda scope

我对 lambda 变量的范围感到困惑,例如以下

var query = 
    from customer in clist
    from order in olist
    .Where(o => o.CustomerID == customer.CustomerID && o.OrderDate ==  // line 1
        olist.Where(o1 => o1.CustomerID == customer.CustomerID)        // line 2
             .Max(o1 => o1.OrderDate)                                  // line 3
    )
    select new {
        customer.CustomerID,
        customer.Name,
        customer.Address,
        order.Product,
        order.OrderDate
    };

在第 1 行中,我声明了一个 lambda 变量“o”,这意味着我不能在第 2 行中再次声明它(或者如果我尝试这样做,至少编译器会提示) 但即使“o1”已经存在,它也不会提示第 3 行??

lambda 变量的作用域是什么?

最佳答案

括号给出了线索​​ - lambda 变量在它声明的范围内被捕获:

.Where(o => ... olist.Where(o1 => ...).Max(o1 => ...))
  //  |----------------------------------------------| scope of o
  //                       |---------|                 scope of first o1
  //                                      |---------|  scope of second o1

请注意,两个 o1 变量没有重叠,但它们都重叠(或隐藏)o 变量,因此不能使用相同的名称。

关于c# - C# 中 lambda 变量的作用域是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494074/

相关文章:

c# - 单声道/Cygwin 问题?

c# - DbConnection.Open 是否总是打开一个新的数据库连接,或者它是否可以重用连接池之一?

c++ - decltype(auto) 从 lambda 捕获中推导出返回类型

r - `<<-` 的 R 帮助文件实际上是否正确?

c# - 如何使用 MVC 在同一个 Controller 中复制一个 Action

java - 泛型 <? super> 通配符在带有方法引用或 lambda 的 java 1.8 中不起作用

java - Spark RDD,如何生成长度为N的JavaRDD?

javascript - 从 JQuery 函数 $.getJSON 获取数据

javascript - AngularJS |仅删除该项目后隐藏表格上的删除图标

c# - 增加c#中字符串的大小