让我们开始吧:首先:
至少在有一种假设下,这不像是一个意外的错误。即所有
有人知道这种行为背后的原因吗?
附言:请不要标记为[duplicate],这个问题不是关于“如何比较?”的。例如,这个问题已经被回答了多次,可以在这里和这里找到答案。
谢谢!
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();
}
}
这里有两个不同的MethodInfo
实例,都包含相同的方法句柄。以下是等于运算符源代码:
(在ideone上尝试在线翻译)
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
实例都被缓存,并且对于相同方法永远不会有两个不同的实例存在。如果是这种情况,显然出现了某些问题。有人知道这种行为背后的原因吗?
附言:请不要标记为[duplicate],这个问题不是关于“如何比较?”的。例如,这个问题已经被回答了多次,可以在这里和这里找到答案。
谢谢!