正如其他人所指出的,Expression 的 == 运算符使用默认的“引用相等”检查 - “它们都是对堆中同一位置的引用吗?”。这意味着像您的示例这样的代码可能会返回 false,因为您的表达式文字将被实例化为不同的 Expression 实例,而不管语义是否相等。使用 lambdas 作为事件处理程序也有类似的挫败感:
MyEvent += (s, a) => DoSomething();
...
MyEvent -= (s, a) => DoSomething(); //<-- will NOT remove the added handler
检查语义相等是棘手的。在这种特殊情况下,您可能能够访问表达式树的所有节点并比较所有字符串、值类型和方法引用,以确定它们是否执行相同的操作。但是,通过检查,以下示例中的两个 lambda 在语义上是等效的,但是您很难编写一个方法来证明它:
public void MyMethod() {...}
public void AnotherMethod { MyMethod(); };
...
Action one = () => MyMethod();
Action two = () => AnotherMethod();
var equal = one == two; // false