public void Variance_HigherOrderFunctions() { //GenericHolder itself is **contravariant** on the T parameter (like an Action<T>) GenericHolder <Animal> animalHolder = (a) => { Console.WriteLine(a.ToString()); }; GenericHolder <Mammal> mammalHolder = (m) => { Console.WriteLine(m.ToString()); }; GenericHolder <Giraffe> giraffeHolder = (g) => { Console.WriteLine(g.ToString()); }; animalHolder(new Animal()); animalHolder(new Mammal()); animalHolder(new Giraffe()); mammalHolder(new Mammal()); mammalHolder(new Giraffe()); giraffeHolder(new Giraffe()); giraffeHolder = mammalHolder = animalHolder; //Meta is **covariant** on the input parameter of type GenericHolder Meta <Giraffe> giraffeMeta = (GenericHolder <Giraffe> holder) => holder(new Giraffe()); Meta <Mammal> mammalMeta = (GenericHolder <Mammal> holder) => holder(new Mammal()); Meta <Animal> animalMeta = (GenericHolder <Animal> holder) => holder(new Animal()); giraffeMeta(giraffeHolder); giraffeMeta(mammalHolder); giraffeMeta(animalHolder); mammalMeta(mammalHolder); mammalMeta(animalHolder); animalMeta(animalHolder); animalMeta = mammalMeta = giraffeMeta; Assert.Pass("If this line executes, means that contravariance works as expected :)"); }
private void StoreTestData(IObjectContainer container) { for (int i = 0; i < NumberOfItems; i++) { var item = new Item(i); container.Store(ItemHolder.Create(item)); container.Store(GenericHolder.Create(item)); } }
private void StoreTestData(IObjectContainer container) { for (int i = 0; i < NumberOfItems; i++) { var item = new Item(i); container.Store(ItemHolder.Create(item)); container.Store(GenericHolder.Create(item)); container.Store( CollectionHolder.Create( item, new Item(NumberOfItems + i), new Item(2 * NumberOfItems + i))); } container.Commit(); }