Почему мы не можем вызвать событие с пользовательской реализацией, а это возможно без них? Смотрите этот код:
public class Program
{
private EventHandler myEvent;
public event EventHandler MyEvent
{
add { myEvent += value; }
remove { myEvent -= value; }
}
public event EventHandler AnotherEvent;
public static void Main()
{
var target = new Program();
target.MyEvent(null, null); // ERROR CS0079
target.AnotherEvent(null, null); // compiles
}
}
Вы видите, что оба события объявлены в моем классе. В то время как target.AnotherEvent(...)
компилируется просто отлично, target.MyEvent(...)
не делает:
Событие MyEvent может появляться только слева от + = или - =.
Я знаю, что событие - это просто делегат с методом добавления и удаления. Таким образом, AnotherEvent
переводится компилятором в метод add и remove:
private EventHandler _AnotherEvent;
public event EventHandler AnotherEvent
{
add { _AnotherEvent += value; }
remove { _AnotherEvent -= value; }
}
Итак, я предполагаю, что вызов AnotherEvent
заменяется компилятором на вызов частному делегату, который был _AnotherEvent(...)
.
Я правильно понял? Есть ли какие-либо документы о том, почему второй вызов работает, а первый - нет? Или хотя бы какое-нибудь описание того, что здесь делает компилятор?