using System; public class TestCasts { private BaseClass baseClass = new BaseClass(); private DerivedClass derivedClass = new DerivedClass(); public TestCasts() {} public int runTests() { if (TestSimpleCasts() < 0) return -1; if (TestSimpleInterfaceCasts() < 0) return -2; if (TestSimpleBoxingUnboxing() < 0) return -3; if (TestAdvancedBoxingUnboxing() < 0) return -4; return 0; } public int TestSimpleCasts() { int res = 0; if (10 != baseClass.getNum(10)) res -= 1; if (11 != derivedClass.getNum(10)) res -= 1; //test allowed cast try { BaseClass castedDerivedClass = derivedClass; if (castedDerivedClass.getNum(10) != 11) res -= 1; } catch (Exception) { res -= 1; } //test not allowed cast try { DerivedClass castedBaseClass = (DerivedClass) baseClass; res -= 1; } catch (Exception) { } return res; } public int TestSimpleInterfaceCasts() { int res = 0; //test not allowed cast try { INum num = (INum) baseClass; res -= 1; } catch (Exception) { } //test allowed cast try { INum num = derivedClass; if (num.getNum() != 666) res -= 1; } catch (Exception) { res -= 1; } return res; } public int TestSimpleBoxingUnboxing() { int res = 0; int i = 100; object box = i; //boxing if (box is int) {} else res -= 1; //unboxing int j = (int) box; if (100 != j) res -= 1; return res; } public int TestAdvancedBoxingUnboxing() { int res = 0; //simple object test //boxing object box = baseClass; if (box is BaseClass) {} else res -= 1; //unboxing BaseClass newBaseClass = (BaseClass) box; if (10 != newBaseClass.getNum(10)) res -= 1; //advanced object test //boxing box = derivedClass; if (box is DerivedClass) {} else res -= 1; if (box is BaseClass) {} else res -= 1; //unboxing newBaseClass = (BaseClass) box; if (11 != newBaseClass.getNum(10)) res -= 1; DerivedClass newDerivedClass = (DerivedClass) box; if (11 != newDerivedClass.getNum(10)) res -= 1; return res; } } //----------------- //class definitions //----------------- public class BaseClass { public BaseClass() { } public virtual int getNum(int num) { return num; } } public class DerivedClass : BaseClass, INum { public DerivedClass() { } // overridden method from base class public override int getNum(int num) { return num + 1; } // method from interface public int getNum() { return 666; } } //--------------------- //interface definitions //--------------------- public interface INum { int getNum(); }