digitalmars.D - Array implicit conversions subvert type system
- Mike Capp (16/16) Nov 24 2006 Can't remember if I raised this before (it was loitering among the testc...
- Gregor Richards (4/24) Nov 24 2006 No, purposeful, contrived subversion of the type system subverts the
- Mike Capp (6/8) Nov 24 2006 Purposeful, contrived subversion of the type system should be marked as ...
- Gregor Richards (7/7) Nov 24 2006 void eatFruit(Fruit[] yum) { ... }
Can't remember if I raised this before (it was loitering among the testcases from my last peek at D), but it's still true in 0.174. "Derived[] to Base[]" assignments really shouldn't happen without either a copy or an explit cast. --- class Fruit {}; class Apple : Fruit {}; class Orange : Fruit {}; void main() { Apple[] apples; apples.length = 3; Fruit[] fruits = apples; Orange orange = new Orange; fruits[1] = orange; if (apples[1] == orange) printf("Oops.\n"); }
Nov 24 2006
Mike Capp wrote:Can't remember if I raised this before (it was loitering among the testcases from my last peek at D), but it's still true in 0.174. "Derived[] to Base[]" assignments really shouldn't happen without either a copy or an explit cast. --- class Fruit {}; class Apple : Fruit {}; class Orange : Fruit {}; void main() { Apple[] apples; apples.length = 3; Fruit[] fruits = apples; Orange orange = new Orange; fruits[1] = orange; if (apples[1] == orange) printf("Oops.\n"); }No, purposeful, contrived subversion of the type system subverts the type system. - Gregor Richards
Nov 24 2006
Gregor Richards wrote:No, purposeful, contrived subversion of the type system subverts the type system.Purposeful, contrived subversion of the type system should be marked as such with a cast, IMHO. That's what casts are for. It's hardly a burden for the programmer, and it prevents accidents. This crops up in basic OO FAQs for a reason. It's a real mistake that real people make.
Nov 24 2006
void eatFruit(Fruit[] yum) { ... } void pickApples() { Apple[] a; for (int i = 0; i < 100; i++) { a ~= new Apple(); } eatFruit(a); // nope, can't eat it, it's Apples, not fruit }
Nov 24 2006