首页 > 解决方案 > 为什么 Linq 允许意外比较分配?

问题描述

与 C 和 C++ 不同,当您在 C# 中执行此操作时

bool b = true;
if(b = false) Console.WriteLine("Dont panic!");

编译器(正确地)抱怨Warning CS0665 Assignment in conditional expression is always constant; did you mean to use == instead of = ?

但是,如果我不小心在 Linq 语句中分配而不是比较,则没有任何警告并且编译器会编译:

var list = new List<bool>() { true, false, true };
var count = list.Count(b => b = false); //returns 0
Console.WriteLine(count);

反编译显示 Lambda 的样子:

internal bool <Main>b__0_0(bool b) => false;

使用对象时情况更糟:

var count = list.Count(s => s.SomeField = false); //returns 0

internal bool <Main>b__0_0(Program.Stuff s)
{
    bool flag;
    s.SomeField = flag = false;
    return flag;
}

编译器是否有理由阻止这一点?

标签: c#linq

解决方案


推荐阅读