他の人が指摘しているように、Expressionの==演算子は、デフォルトの「参照の同等性」チェックを使用します-「両方ともヒープ内の同じ場所への参照ですか?」これは、式のリテラルがセマンティックの同等性に関係なく異なる式インスタンスとしてインスタンス化されるため、例のようなコードはfalseを返す可能性が高いことを意味します。ラムダをイベントハンドラーとして使用することにも同様のフラストレーションがあります。
MyEvent += (s, a) => DoSomething();
...
MyEvent -= (s, a) => DoSomething(); //<-- will NOT remove the added handler
セマンティックの同等性をチェックするのは難しいです。この特定のケースでは、式ツリーのすべてのノードにアクセスし、すべての文字列、値型、およびメソッド参照を比較して、それらが同じことを行うことを確認できる場合があります。ただし、調べてみると、次の例の2つのラムダは意味的に同等ですが、それを証明するメソッドを作成するのは難しいでしょう。
public void MyMethod() {...}
public void AnotherMethod { MyMethod(); };
...
Action one = () => MyMethod();
Action two = () => AnotherMethod();
var equal = one == two; // false