public void ContraVariance() { Contravariance cv = DoSomething; // DoSomething has a type that is **less derived** than that specified in the delegate. // Assigning less derived type to the delegate - therefore, is an example of ContraVariance. }
public void ContravarianceTest() { IContravariance <BaseClass> b = new Contravariance(); // IContravariance<BaseClass> => IContravariance<DerivedClass>로 implicit conversion. // 반대로는 불가능. IContravariance <DerivedClass> d = b; }
public void Test() { //Covariance<Base> coB = new CoContraVarianceCollection(); //Covariance<Derived> coD = coB; Covariance <Derived> coD = new CoContraVariance(); Covariance <Base> coB = coD; //Contravariance<Derived> contraD = new CoContraVarianceCollection(); //Contravariance<Base> contraB = contraD; Contravariance <Base> contraB = new CoContraVariance(); Contravariance <Derived> contraD = contraB; }
static void varianceInDelegates() { //with variance, the method does not need to match with the delegate //Covariance | return type | Delegate return Parent | Method return a Child //ContraVariance | parameter type | Delegate recive as parameter a Child | Method recive as parameter Parent Covariance conv = new Covariance(covarianceMethod); conv(); Contravariance cont = new Contravariance(contraVarianceMethod); Child c = new Child(); contraVarianceMethod(c); }
public void TestMethod001() { // Arrange IComparer <Animal> compareAnimals = new AnimalSizeComparator(); Contravariance contravariance = new Contravariance(); Cat catOne = new Cat("NallaPilli") { Size = 10 }; Cat catTwo = new Cat("ThellaPilli") { Size = 9 }; // Act Cat actual = contravariance.Winner(catOne, catTwo, compareAnimals); // Assert Assert.AreEqual(catOne, actual); }
private static void ContravarianceRunner() { NewSubject.WriteLine(nameof(Contravariance)); Contravariance.Run(); }