| using System; |
| using virtual_polyNamespace; |
| |
| public class runme { |
| static void Main() { |
| |
| NDouble d = new NDouble(3.5); |
| NInt i = new NInt(2); |
| |
| // |
| // These two natural 'copy' forms fail because no covariant (polymorphic) return types |
| // are supported in C#. |
| // |
| // NDouble dc = d.copy(); |
| // NInt ic = i.copy(); |
| |
| // |
| // Unlike C++, we have to downcast instead. |
| // |
| NDouble dc = (NDouble)d.copy(); |
| NInt ic = (NInt)i.copy(); |
| |
| NDouble ddc = NDouble.narrow(dc); |
| NInt dic = NInt.narrow(ic); |
| dc = ddc; ic = dic; // warning suppression |
| |
| virtual_poly.incr(ic); |
| if ( (i.get() + 1) != ic.get() ) |
| throw new Exception("incr test failed"); |
| |
| // |
| // Checking a pure user downcast |
| // |
| NNumber n1 = d.copy(); |
| NNumber n2 = d.nnumber(); |
| NDouble dn1 = NDouble.narrow(n1); |
| NDouble dn2 = NDouble.narrow(n2); |
| |
| if ( (dn1.get()) != dn2.get() ) |
| throw new Exception("copy/narrow test failed"); |
| |
| // |
| // Checking the ref polymorphic case |
| // |
| NNumber nr = d.ref_this(); |
| NDouble dr1 = NDouble.narrow(nr); |
| NDouble dr2 = (NDouble)d.ref_this(); |
| if ( dr1.get() != dr2.get() ) |
| throw new Exception("copy/narrow test failed"); |
| } |
| } |