Как уже отмечали другие, оператор Expression == использует стандартную проверку «равенство ссылок» - «Являются ли они обе ссылкой на одно и то же место в куче?».Это означает, что код, подобный вашему примеру, скорее всего, вернет false, поскольку литералы вашего выражения будут создаваться как разные экземпляры Expression независимо от какого-либо семантического равенства.Существуют похожие проблемы с использованием лямбда-выражений в качестве обработчиков событий:
MyEvent += (s, a) => DoSomething();
...
MyEvent -= (s, a) => DoSomething(); //<-- will NOT remove the added handler
Проверка на семантическое равенство является сложной задачей.В этом конкретном случае вы можете посетить все узлы дерева выражений и сравнить все строки, типы значений и ссылки на методы, чтобы определить, что они делают то же самое.Тем не менее, согласно проверке, две лямбды в следующем примере семантически эквивалентны, но вам будет сложно написать метод, чтобы доказать это:
public void MyMethod() {...}
public void AnotherMethod { MyMethod(); };
...
Action one = () => MyMethod();
Action two = () => AnotherMethod();
var equal = one == two; // false