public static void ContravariantGeneric() { IContravariantGeneric <MiddleClass> genericMiddle = new ContravariantGeneric <MiddleClass>(); genericMiddle.Method(new MiddleClass()); IContravariantGeneric <LastClass> genericMiddle1 = new ContravariantGeneric <MiddleClass>(); genericMiddle1.Method(new LastClass()); IContravariantGeneric <LastClass> genericMiddle2 = new ContravariantGeneric <BaseClass>(); genericMiddle2.Method(new LastClass()); IContravariantGeneric <MiddleClass> genericMiddle3 = new ContravariantGeneric <BaseClass>(); genericMiddle3.Method(new MiddleClass()); IContravariantGeneric <BaseClass> genericMiddle4 = new ContravariantGeneric <BaseClass>(); genericMiddle4.Method(new BaseClass()); // This will produce compile-time error: // Cannot implicitly convert type 'IContravariantGeneric<MiddleClass>' to 'IContravariantGeneric<BaseClass>'. // An explicit conversion exists (are you missing a cast?) //// IContravariantGeneric<BaseClass> genericBase = genericMiddle; // This is OK here: IContravariantGeneric <LastClass> genericLast = genericMiddle; genericLast.Method(new LastClass()); }
private static void WithContravariantGeneric() { IContravariantGeneric <LastClass> contravariantGeneric = new ContravariantGeneric <MIddleClass>(); contravariantGeneric.Method(new LastClass()); }