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 :)");
        }
Пример #2
0
 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));
     }
 }
Пример #3
0
 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();
 }