Что делает подписка события на другое событие в C #?

#c# #events

#c# #Мероприятия

Вопрос:

Недавно я снова наткнулся на проблему, касающуюся событий, и я не смог найти ничего, что отвечало бы на то, что на самом деле делает этот синтаксис: event1 = event2

Вот 2 примера методов с одинаковыми событиями для целей тестирования:

 private event Action A = null;
private event Action B = null;
private event Action C = null;
  

Эта версия (упрощенная) действительно работает (которую я использовал, при этом каждое событие имеет свой собственный метод запуска):

 private void DoTest1 ()
{
    A  = () => DebugText ($"A Test");
    A  = () => B.Invoke ();
    B  = () => DebugText ($"B Test");
    B  = () => C.Invoke ();
    C  = () => DebugText ($"C Test");

    A.Invoke ();
    // Result: A Test, B Test, C Test
}
  

Это работает не так, как ожидалось:

 private void DoTest2 ()
{
    A  = () => DebugText ($"A Test");
    A  = B;
    B  = () => DebugText ($"B Test");
    B  = C;
    C  = () => DebugText ($"C Test");

    A.Invoke ();
    // Result: A Test
}
  

Итак, мне интересно, почему компилятор принимает синтаксис, если он, похоже, не работает? Чего мне здесь не хватает?

Комментарии:

1. Отладьте DoTest2 и посмотрите, не равно ли значение B нулю, когда оно добавляется к A?

2. Я думаю, что они разрешаются во время сборки. Проверьте этот порядок , а затем этот

3. @Cid — Думаю, теперь я понимаю, спасибо! Это потому, что таким образом события просто складывают свое текущее содержимое, а не связывают их вместе каким-либо постоянным способом. Я помню, что узнал об этом давным-давно, но забыл эту часть. Кстати, отличный сайт!

4. Предположим, что вместо событий и делегатов у вас было int A = 1; int B = 10; . Если вы скажете A = A B; B = B 10; Console.WriteLine(A); , что вы ожидаете записать? (1) 11 потому A B что во время назначения было 11 или (2) 21 потому что во время выполнения строки записи каким-то образом известно, что стало A B 20? Чего вы ожидаете?