Наткнулся на частный случай,
Пруфтест скинул.
class A
{
public virtual void M() { }
}
class B : A
{
public override void M() { }
}
[Test]
public void MethodHandleTestFails()
{
var comparer = ComparerBuilder<MethodInfo>.GetEqualityComparer(m => m.MethodHandle);
var a = typeof(A).GetMethod("M");
var b = typeof(B).GetMethod("M");
var b2 = b.GetBaseDefinition();
Assert.False(a.Equals(b), "MethodInfo fails");
Assert.True(a.Equals(b2), "MethodInfo fails");
Assert.False(a.MethodHandle.Equals(b.MethodHandle), "MethodHandle fails");
Assert.True(a.MethodHandle.Equals(b2.MethodHandle), "MethodHandle fails");
Assert.False(EqualityComparer<RuntimeMethodHandle>.Default.Equals(a.MethodHandle, b.MethodHandle), "EqualityComparer fails");
Assert.True(EqualityComparer<RuntimeMethodHandle>.Default.Equals(a.MethodHandle, b2.MethodHandle), "EqualityComparer fails");
Assert.False(comparer.Equals(a, b), "ComparerBuilder fails"); // <= fails
Assert.True(comparer.Equals(a, b2), "ComparerBuilder fails");
}
, падает.
В деталях пока не копался, самописные компареры сделал.