static void Main() { B[] data1 = new B[] { new B(), new B(), new B() }; B[] data2 = new B[] { new C(), new B(), new C() }; C[] data3 = new C[] { new C(), new C(), new C() }; List <B> list1 = new List <B>(data1); List <C> list3 = new List <C>(data3); ArraysVariance.ShowBs(data1); ArraysVariance.ShowBs(data2); ArraysVariance.ShowBs(data3); ArraysVariance.ReplaceB(data1, new B()); ArraysVariance.ReplaceB(data1, new C()); ArraysVariance.ReplaceB(data3, new C()); try { ArraysVariance.ReplaceB(data3, new B()); } catch (Exception e) { Console.WriteLine(e); } GenericsInvariance.ShowListOfBs(list1); //GenericsInvariance.ShowListOfBs(list3); DelegatesVariance.CreateAndShow(DelegatesVariance.makeB); DelegatesVariance.CreateAndShow(DelegatesVariance.makeC); DelegatesVariance.CallUseB(DelegatesVariance.PrintA, new C()); DelegatesVariance.CallUseB(DelegatesVariance.PrintB, new C()); //DelegatesVariance.CallUseB(DelegatesVariance.PrintC, new B()); }