Así es como se ve cuando se compila en IL y luego se vuelve a descompilar en C#. Tenga en cuenta que en ambos casos hay new Action(Main)
- un nuevo objeto de referencia (delegado) con un puntero al método real almacenado en el interior.
private static void Main()
{
Program.Compare1(new Action(Program.Main)).Dump();
Program.Compare2(new Action(Program.Main)).Dump();
Console.ReadLine();
}
private static bool Compare1(Delegate x)
{
return x == new Action(Program.Main);
}
private static bool Compare2(Action x)
{
return x == new Action(Program.Main);
}
Si a continuación, echamos un vistazo a CIL, los antiguos usos ceq
(comparación de referencia) y los segundos usos call bool [mscorlib]System.Delegate::op_Equality(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
para comparar los delegados.
Primero devuelve false
porque las acciones que envuelven a sus delegados son dos objetos de referencia distintos.
Segundo devuelve true
como el operador de igualdad implementado en la clase Delegate
compara objetivos reales dentro de contenedores (acciones).
Cambiando 'Compare1' para usar' return x == (Delegate) (Action) Main; 'lo devuelve' true'. Sin embargo, no estoy seguro de por qué. – Joey
FYI: Hice una pregunta relativa aquí: http: //stackoverflow.com/questions/8939350/implicit-method-group-conversion-gotcha-part-2 –