digitalmars.D - Array implicit conversions subvert type system
- Mike Capp <mike.capp gmail.com> Nov 24 2006
- Gregor Richards <Richards codu.org> Nov 24 2006
- Mike Capp <mike.capp gmail.com> Nov 24 2006
- Gregor Richards <Richards codu.org> Nov 24 2006
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








Gregor Richards <Richards codu.org>