Компилятор C # сначала создает лямбда-выражение, которое вы написали, прежде чем присваивать результат переменной. Поэтому, когда лямбда определена, обработчик не имеет значения.
Хотя это работает, если вы ранее присвоили EventHandler значение null.
Поскольку это замыкание и локальные переменные захватываются в замыкании, во время вызова обработчик будет иметь правильное значение и будет работать:
EventHandler handler=null;
handler = (s, e) =>
{
// Do something
SizeChanged -= handler;
};
SizeChanged += handler;
Для всех людей, проголосовавших вниз: Это не вызовет исключение NullReferenceException. handler - это локальная переменная, которая фиксируется в замыкании, поэтому значение обработчика внутри лямбды будет меняться при изменении в методе, который содержит замыкание. Я проверил это на самом деле на моем компьютере, и он отлично работает.