array of elements of various sybtypes
Jonathan M Davis
jmdavisProg at gmx.com
Wed Jan 26 10:32:44 PST 2011
On Wednesday, January 26, 2011 09:30:17 spir wrote:
> On 01/26/2011 06:27 PM, spir wrote:
> > Hello,
> >
> > This fails:
> >
> > class T0 {}
> > class T1 : T0 {}
> > class T2 : T0 {}
> >
> > unittest {
> > auto t1 = new T1();
> > auto t2 = new T2();
> > T0[] ts = [t1, t2];
> > }
> >
> > Error: cannot implicitly convert expression (t1) of type __trials__.T0 to
> > __trials__.T2
> > Error: cannot implicitly convert expression ([(__error),t2]) of type T2[]
> > to T0[]
> >
> > I guess it should be accepted due to explicite typing 'T0[]'. What do you
> > think? D first determines the type of the last element (always the last
> > one), here T2. Then, /ignoring/ the array's defined type, tries to cast
> > other elements to the same type T2. It should instead, I guess, check
> > all elements are compatible with the defined array type.
> > An additional enigma is why the failing element t1 is said to be of
> > supertype T0 --which is also correct-- while it retained t2's exact type
> > T2. ???
> >
> > Anyway, is there a workaround?
>
> PS: this works, but I would prefere a solution with all casting:
> T0[] ts = [cast(T0)t1, cast(T0)t2];
> I consider this issue a bug, at least when the array is explicitely typed.
> What do you think?
The problem is that the expression to the right of the assignment is completely
independent from the assignment. The expression results in whatever type it
results in, and _then_ it's assigned to the variable. In this case, its a
variable declaration as opposed to an assignment, so it's initializing the
variable instead of assigning to it, but from the perspective of the expression,
there's no difference. It's just like how you can't overload functions on return
type. How the result of the function is used is irrelevant to evaluating the
function. In this case, how the result of the expression is used is irrelevant
to evaluating it. It would actually probably be a pretty big language change to
try and make it otherwise, and I'm not sure what all the ramifications are. I can
see why you'd want it, but I really don't expect it to happen. Walter just
wouldn't go for it. So, it's not a bug at all.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list