Проблема не связана с событиями.
Оператор с нулевым условием должен остановить оценку, если ссылка нулевая.
Это не применимо в левой или правой частиприсваивание.
Если у вас есть:
public class Test
{
public int Value;
public void Method() { }
}
Вы не можете написать:
Test v;
v?.Value = 10;
int a = v?.Value;
Потому что, если v равно нулю, v.Value не оценивается.
Таким образом, то же самое происходит при добавлении или удалении обработчика события в переменную события, которая пуста, когда пуста.
C # событие равно нулю
Следовательно,ошибка компилятора, запрещающая такие записи.
Вот почему вы не можете написать:
TargetButton?.Click +=(ss,ee)=>{...}
Потому что что делать с (ss,ee)=>{...}
, если TargetButton
равно нулю?
Можно сказать, что вы хотите, чтобы компилятор игнорировал это.
Но компилятор не допускает таких нечистых действий.
Мы можем написать следующее:
v?.Test();
Здесьis v is null метод не вызывается, и все в порядке, потому что нет ничего правильного или левого, с которым компилятор не знает, что делать.
int a = v?.Value ?? 0;
Здесь, если v равно нулю, используется 0.
Нулевые операторы? и? []
Нулевые коалесцирующие операторы ?? и ?? =