Listing 5

using namespace System;
delegate void D(int x);

void F1(int i) { Console::WriteLine("F1: {0}", i); }
void F2(int i) { Console::WriteLine("F2: {0}", i); }

int main()
{ 
    D^ cd1 = gcnew D(&F1);
    D^ cd2 = gcnew D(&F2);
/*1*/   D^ list1 = cd1 + cd2;   // F1 + F2
/*2*/   D^ list2 = cd2 + cd1;   // F2 + F1
    D^ cd3 = nullptr;
/*3a*/  cd3 = list2 + list1;    // F2 + F1 + F1 + F2
    cd3(10);
/*3b*/  cd3 = list1 + list2;    // F1 + F2 + F2 + F1
    cd3(20);
/*4a*/  cd3 = list1 + list2;    // F1 + F2 + F2 + F1
/*4b*/  cd3 -= cd1 + cd2;       // F2 + F1
    cd3(30);
/*5a*/  cd3 = list1 + list2;    // F1 + F2 + F2 + F1
/*5b*/  cd3 -= cd2 + cd2;       // F1 + F1
    cd3(40);
/*6a*/  cd3 = list1 + list2;    // F1 + F2 + F2 + F1
/*6b*/  cd3 -= cd2 + cd1;       // F1 + F2
    cd3(50);
/*7a*/  cd3 = list1 + list2;    // F1 + F2 + F2 + F1
/*7b*/  cd3 -= cd1 + cd1;       // F1 + F2 + F2 + F1
    cd3(60);
}