让我们从:
开始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();
}
}
((try it online表示)
因此,有两个不等MethodInfo
个实例,两个实例都包含相同的方法句柄。这是the equals operator source:
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);
}
它看起来不像是一个偶然的错误,至少在假设RuntimeMethodInfo
的所有实例都被缓存并且更新的将是同一方法的两个不同实例之前。在那种情况下,事情显然会被打破。
这种行为背后的任何原因,任何人?
P.S。不要标记为[重复],请:)问题不是'如何比较?'。多次回答了这个问题,例如here和here。
谢谢!
答案 0 :(得分:6)
我相信你对它背后的推理的假设 - 两个RuntimeMethodInfo
实例可以通过引用相等来比较 - 是正确的。你认为它已经被打破的假设不是正确的。
这里的两个MethodInfo
对象不同,因为它们具有不同的ReflectedType
属性:
Console.WriteLine(m1.ReflectedType); // Program+A
Console.WriteLine(m2.ReflectedType); // Program+B