В этой строке:
d_Lines = new FuncInvoker(i_FuncToAdd);
... вы на самом деле создаете новый экземпляр делегата, который оборачивает исходный делегат. Метод-цель этого нового делегата будет Invoke
методом исходного делегата (при условии, что он одноадресный), который объясняет поведение, которое вы наблюдаете.
Очевидный обходной путь - не использовать оболочку, а просто скопировать ссылку на исходный делегат в переменную:
d_Lines = i_FuncToAdd;
Но вы могли бы также полностью отказаться от ветки 'special-case' и просто сделать (при условии, что аргумент не может быть null
):
public void AddMenuRow(FuncInvoker i_FuncToAdd)
{
d_Lines += i_FuncToAdd;
}
Это будет работать нормально, так как Delegate.Combine
(то есть синтаксис +=
) предназначен для возврата ссылки на второй делегат, если первый делегат равен null
, вместо броска исключение.