RuntimeMethodInfo相等:bug?

Sin*_*nix 3 .net c# reflection

让我们开始:

using System;

public class Program
{
    class A
    {
        public virtual void Do() { }
    }

    class B:A
    {
    }

    public static void Main()
    {
        var m1 = typeof(A).GetMethod("Do");
        var m2 = typeof(B).GetMethod("Do");

        Console.WriteLine("Methods are equal?\t\t{0}", m1 == m2);
        Console.WriteLine("Method handles are equal?\t{0}", m1.MethodHandle == m2.MethodHandle);

        Console.WriteLine("Done.");
        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

(在ideone 在线试试)

所以,有两个不相等的MethodInfo实例,都包含相同的方法句柄.这是equals运算符源:

public static bool operator ==(MethodInfo left, MethodInfo right)
{
    if (ReferenceEquals(left, right))
        return true;

    if ((object)left == null || (object)right == null ||
        left is RuntimeMethodInfo || right is RuntimeMethodInfo) // <----??? 
    {
        return false;
    }
    return left.Equals(right);
}
Run Code Online (Sandbox Code Playgroud)

它看起来不像是一个偶然的错误,至少在假设所有实例RuntimeMethodInfo都被缓存并且更新的将是同一方法的两个不同实例之前.在那种情况下,显然有些东西被打破了.

这种行为背后的任何原因,任何人?

PS请勿标记为[重复],请:)问题不是'如何比较?'.多次回答,例如这里这里.

谢谢!

Jon*_*eet 6

我相信你对它背后的推理的假设 - 两个RuntimeMethodInfo实例可以通过引用相等来比较 - 是正确的.你认为它被打破的假设是不正确的.

MethodInfo这里的两个对象不同的,因为它们具有不同的ReflectedType属性:

Console.WriteLine(m1.ReflectedType); // Program+A
Console.WriteLine(m2.ReflectedType); // Program+B
Run Code Online (Sandbox Code Playgroud)