[@IT, Bug] ComparerBuilder<T>, некорректный codegen
От: Sinix  
Дата: 21.01.17 11:13
Оценка: 29 (2)
Наткнулся на частный случай, Пруфтест скинул.
        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");
        }

, падает.

В деталях пока не копался, самописные компареры сделал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.