К сожалению, лямбды в C # используют равенство ссылок, а не равенство значений. Попробуйте следующее:
Func<bool> f1 = () => true;
Func<bool> f2 = () => true;
Console.WriteLine("f1 == f2 results in " + (f1 == f2));
Угадай что? Ответ неверен.
Это также ложно для выражения ...
Expression<Func<bool>> f1 = () => true;
Expression<Func<bool>> f2 = () => true;
Console.WriteLine(f1.ToString()); // Outputs "() => True"
Console.WriteLine("a1 == a2 results in " + (f1 == f2)); // False
К сожалению, лучший способ решить эту проблему (и ее уродливость) в C # (а следовательно, и в Rhino Mocks) - использовать ToString () в выражениях и сравнить их.
Expression<Func<bool>> f1 = () => true;
Expression<Func<bool>> f2 = () => true;
Console.WriteLine(f1.ToString()); // Outputs "() => True"
Console.WriteLine("a1 == a2 results in " + (f1.ToString() == f2.ToString())); // True
Вы должны быть осторожны с этой техникой, поскольку два выражения, "x => x" и "y => y", хотя и функционально эквивалентны, все равно будут иметь значение false из-за различных параметров. Также имейте в виду, что вы должны делать это с Expression, а не с Func или Action, чтобы этот трюк ToString () работал.