次のコード行をコンパイルできる理由についての説明を探しています。
var results = someCollection.Where(x => x.SomeBooleanProperty = true);
単一の等式演算子の使用に注意してください(おそらく開発者は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);
}