并行 LINQ - .Select() + .ForAll() 返回奇怪的结果

Parallel LINQ - .Select() + .ForAll() returning bizarre results

我这辈子都弄不明白为什么所有的 foo 都不为空。 我假设 .ForAll() 应该在我调用 .All() 方法之前执行,但事实并非如此?

public class Foo
{
    public string Bar { get; set; }
}

static void Main(string[] args)
{
    var foos = new List<Foo> { new Foo(), new Foo(), new Foo() };
    var newFoos = foos
        .AsParallel()
        .Select(x =>
        {
            x.Bar = "";
            return x;
        });
    newFoos.ForAll(x => x = null);
    var allFoosAreNull = newFoos.All(x => x == null);
    Console.WriteLine(allFoosAreNull); // False ??
}

当你这样做时

newFoos.ForAll(x => x = null);

您正在将 null 分配给 x,这是您的 lambda 的参数。 x 是 lambda 的局部变量。它不是 ref 参数,并且为其赋值在其主体之外没有任何效果。实际上,该行什么都不做。