array of elements of various sybtypes

Steven Schveighoffer schveiguy at yahoo.com
Mon Jan 31 12:06:10 PST 2011


On Fri, 28 Jan 2011 16:59:20 -0500, Don <nospam at nospam.com> wrote:

> 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.
>
> No, it's not supposed to do that. What is supposed to happen is, to use  
> ?: to determine the common type of the array. This will give a T0[]  
> array.
> Then, it attempts to implicitly cast to the defined type.
>
> Your code should work. You've just hit an implementation bug.

I don't think it should do that.  But I'm not sure.

It seems it can have several choices as to what base to use.  For example,  
what if both T1 and T2 implement the X interface, wouldn't X be just as  
good a choice?

I'm really unsure what the right thing to do is.  But regardless of all  
this, I think there should absolutely be a way to say "I absolutely need  
this array literal to be typed as a U[]" and let the compiler fail if it's  
not possible.

-Steve


More information about the Digitalmars-d-learn mailing list