我正在寻找解释为什么允许编译以下代码行的原因:
var results = someCollection.Where(x => x.SomeBooleanProperty = true);
Run Code Online (Sandbox Code Playgroud)
注意使用单个相等运算符(可能是开发人员处于SQL模式),这是一个非常容易犯的错误.这会编译并在评估结果时(例如someCollection.ToList())将整个集合中的标志更改为true !!
如果您正在使用实体框架或任何其他ORM,那么这可以被检测为更改.我刚刚在生产代码中遇到过这个问题,但幸运的是,它只在一个只读屏幕上引起了一个小问题(但完全是竹子问题).想象一下,如果数据实际上是持久的,可能由此引起的可怕的逻辑和数据问题.
只是为了确保我没有发疯,它确实改变了数据,我写了一个失败的测试:
[Test]
public void Test_because_im_scared()
{
var falseProperty = new TestModel {BooleanProperty = false};
var trueProperty = new TestModel {BooleanProperty = true};
var list = new List<TestModel>{falseProperty, trueProperty};
var results = list.Where(x => x.BooleanProperty = true);
Assert.IsFalse(falseProperty.BooleanProperty);
Assert.IsTrue(trueProperty.BooleanProperty);
//all fine so far, now evaluate the results
var evaluatedResults = results.ToList();
Assert.IsFalse(falseProperty.BooleanProperty); //test fails here!
Assert.IsTrue(trueProperty.BooleanProperty);
}
Run Code Online (Sandbox Code Playgroud)