Так выглядит при компиляции в IL и декомпиляции обратно в C #.Обратите внимание, что в обоих случаях new Action(Main)
- новый ссылочный объект (делегат) с указателем на фактический метод, хранящийся внутри.
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);
}
Если затем мы посмотрим на CIL, первый использует ceq
(сравнительное сравнение), а последний использует call bool [mscorlib]System.Delegate::op_Equality(class [mscorlib]System.Delegate, class [mscorlib]System.Delegate)
для сравнения делегатов.
Сначала возвращается false
, потому что действия, обертывающие ваши делегаты, являются двумя различными ссылочными объектами.
Второй возвращает true
, так как оператор равенства, реализованный в классе Delegate
, сравнивает фактические цели внутри оболочек (действия).