Covariant problem

Lars Ivar Igesund larsivar at igesund.net
Wed Jul 23 10:54:14 PDT 2008


Steven Schveighoffer wrote:

> "Lars Ivar Igesund" wrote
>> Steven Schveighoffer wrote:
>>
>>> "Zarathustra" wrote
>>>> error:
>>>> function basis.CPolygon2d.getPoints of type CPoint2d[]() overrides but
>>>> is
>>>> not covariant with basis.CPolygon3d.getPoints of type CPoint3d[]()
>>>>
>>>> I don't know how to fix this problem. What does 'covariant' mean?
>>>
>>> Covariant means that the override returns something that can be
>>> implicitly
>>> casted to the base version.
>>>
>>> So the error looks like the base class function getPoints returns type
>>> CPoint3d[], but the derived class is returning CPoint2d[].  In order for
>>> this to work, CPoint2d[] must be implicitly castable to CPoint3d[],
>>> which probably isn't true.
>>>
>>> In order to diagnose the problem exactly, we would have to see code.  At
>>> least the class hierarchy.
>>>
>>> -Steve
>>
>> Arrays are not implicitly castable (not even explicitly afaik) to another
>> type, no matter how they are related.
> 
> From http://www.digitalmars.com/d/1.0/arrays.html
> 
> A dynamic array T[] can be implicitly converted to one of the following:
> 
>   a.. U[]
>   b.. void[]
> Where U is a base class of T.

Hmm, was it always that way? In any case, implicitly casting from U[] to T[]
doesn't work, and if you do it explicitly, the result won't work (and IIRC
doing foreach and cast was not an acceptable general solution), and as such
T[] is not co-variant return type for U[].

-- 
Lars Ivar Igesund
blog at http://larsivi.net
DSource, #d.tango & #D: larsivi
Dancing the Tango


More information about the Digitalmars-d-learn mailing list