Date: 25.12.2017 9:34:24
Событие, в плане генерируемого компилятором кода, состоит из двух частей: поле (многоадресный делегат) и пара методов для доступа к нему ("Добавить" и "Удалить", эквивалентные операторам += и -=).
Объявление public-события делает методы доступа открытыми, но само поле делегата делается private. Поэтому его можно прибавить/убавить, но не вызвать делегат напрямую. Это необходимо для соблюдения принципов ООП, если бы к делегату любого события можно было получить доступ напрямую, царил бы полный хаос. См. здесь более подробное объяснение.
Date: 25.12.2017 10:11:20
Date: 25.12.2017 10:58:33
1. Да, так как вызывается вполне определенный метод (Delegate.Combine, Delegate.Equals, ...), известный на этапе компиляции. Позднее связывание возникает при вызове абстрактного метода или использовании reflection.
2. Не могу прокомментировать "механизм событий прописан на IL, короче, аналогично на C# такого не описать", я не настолько специалист в этом. Видимо, дело в том, что на уровне IL event - это вообще не поле, а просто контейнер для методов add/remove. Конфликта нету, потому что это разные вещи. Обращение к += (снаружи класса) на уровне IL становится просто вызовом пользовательского add-метода. А какой-то специальной операции "подписка на событие" на низком уровне нету.
Автор: VadimTagil