Синтаксис, который вы использовали для объявления события в вашем примере, на самом деле является синтаксическим сахаром для чего-то вроде этого:
private Action _actionRequired;
public event Action ActionRequired
{
add { _actionRequired += value; }
remove { _actionRequired -= value }
}
(фактический код, конечно, немного сложнее)
Важной частью здесь является то, что поле _actionRequired
является приватным.Только само событие является публичным, но это всего лишь пара методов добавления / удаления (аналогично свойству).Таким образом, единственное, что вы можете сделать с событием, это подписаться на него или отказаться от него.Поле, содержащее фактический делегат, является закрытым, поэтому доступ к нему можно получить только из класса, который его объявляет.Когда вы используете ActionRequired
в классе, который его объявляет, он ссылается либо на поле делегата, либо на само событие, в зависимости от контекста.
Но из любого другого класса доступно только событие, а неполе.Вот почему вы не можете вызвать делегат из другого класса, даже из производного класса.