lambda表达式中的赋值

时间:2014-03-17 15:35:32

标签: c# lambda expression

我做了一个扩展,它在ObservableCollection上添加了ForEach()方法:

public static void ForEach<T>(this ObservableCollection<T> enumerable, Action<T> action)
{
    foreach (var item in enumerable)
        action(item);
}

当我使用它时,像这样:

private bool Bar(int i)
{
    return i % 2 == 1;
}

private void Foo()
{
    Boolean ok = true;
    ObservableCollection<int> oc = new ObservableCollection<int> { 1, 2, 3, 4 };

    oc.ForEach(i => ok &= Bar(i));
    //ok is now false
}

我不明白ok布尔值如何取Bar()执行的action(item)方法返回的值?

2 个答案:

答案 0 :(得分:2)

允许Lambdas修改其体内代码范围内的变量。你需要非常小心这种代码,因为你并不总是完全控制执行lambda的时间。

例如,如果将一个赋值添加到传递给具有延迟执行的方法的lambda,那么该lambda的副作用(即赋值)在该lambda的代码实际执行之前将不可见。 / p>

以下是一个例子:

bool ok = true;
IEnumerable<int> res = new[] {1, 2, 3}.Where(i => ok &= (i == 2));
// ok is true here
IList<int> listRes = res.ToList();
// ok is false here

如果您运行此代码,ok将保持true,即使源列表的第一项会触发falseok变量的分配。但是,在您枚举res之前,这不会发生。

答案 1 :(得分:0)

你正在应用&amp; =哪个会和每个结果都带有ok的previos值(因为ok不是单个循环迭代的本地结果,它是在循环之外声明的)。换句话说,

因为条件仅适用于两个值(1和3)

ok = true&amp;&amp;虚假&amp;&amp;真实&amp;&amp;假

这是假的。