Давайте поместим ваш код в SharpLab и посмотрим, что генерирует компилятор.
Я использую этот код, который приблизительно соответствует коду в вашем вопросе:
using System;
public class C {
private Phase _currentPhase;
private void StartCurrentPhase()
{
Action callback = delegate { OnPhaseFinished(_currentPhase); };
_currentPhase.Activate(callback);
}
private void OnPhaseFinished(Phase currentPhase)
{
}
}
public class Phase
{
public void Activate(Action callback) { }
}
Затем компиляторгенерирует:
public class C
{
private Phase _currentPhase;
private void StartCurrentPhase()
{
Action callback = new Action(<StartCurrentPhase>b__1_0);
_currentPhase.Activate(callback);
}
private void OnPhaseFinished(Phase currentPhase)
{
}
[CompilerGenerated]
private void <StartCurrentPhase>b__1_0()
{
OnPhaseFinished(_currentPhase);
}
}
public class Phase
{
public void Activate(Action callback)
{
}
}
Смотрите здесь на SharpLab
Вы можете видеть, что компилятор превратил ваш delegate { OnPhaseFinished(_currentPhase); };
в приватный метод класса C
:
private void <StartCurrentPhase>b__1_0()
{
OnPhaseFinished(_currentPhase);
}
Затем создается экземпляр делегата Action
, указывающий на этот сгенерированный метод <StartCurrentPhase>b__1_0
.
Таким образом, компилятор реализует анонимные делегаты (и лямбды): путем созданияновый закрытый метод (иногда в текущем классе, но иногда в совершенно новом классе).
Получилось так, что он назвал метод <StartCurrentPhase>b__1_0
, созданный после имени метода, который содержит анонимный делегат,но это полностью его решение - он мог бы назвать его как угодно.
Это не означает, что вызов делегата каким-то образом вызывает метод StartCurrentPhase
. Вы можете видеть, что он вызывает метод <StartCurrentPhase>b__1_0
(который отличается от до StartCurrentPhase
), который в свою очередь вызывает OnPhaseFinished(_currentPhase);
.