Is this bug or not?
Steven Schveighoffer
schveiguy at yahoo.com
Fri May 6 06:22:28 PDT 2011
On Fri, 06 May 2011 08:49:44 -0400, Jason House
<jason.james.house at gmail.com> wrote:
> Steven Schveighoffer Wrote:
>
>> On Fri, 06 May 2011 03:39:31 -0400, Mariusz Gliwiński
>> <alienballance at gmail.com> wrote:
>>
>> > Is this bug, or is it as supposed to be? I'm not sure...
>> > <code>
>> > interface TmpI(T) {
>> > void func(T);
>> > }
>> >
>> > class TmpC {}
>> > class TmpC2 : TmpC {}
>> >
>> > class Tmp : TmpI!TmpC2 {
>> > void func(TmpI!TmpC) {};
>>
>> Here is one problem, TmpI is instantiated with TmpC2 as the func
>> parameter, yet you use TmpI!TmpC as your func parameter. The func
>> parameter should be TmpC2. I'm surprised this part would compile
>> without
>> complaining that you didn't implement func. But it probably would fail
>> if
>> it got to that check.
>
>
> This part is fine. When extending a class or interface, you are free to
> widen the input and narrow the output. Users of the interface can pass
> in TmpC2 (it's a valid TmpC)
But look at TmpI, if T is TmpC2, then func's param is TmpC2. This can't
be implemented with TmpI!TmpC.
Let's take templates out of it, and look at what is generated:
interface TmpI1 // in original exmample, this is TmpI!TmpC2
{
void func(TmpC2);
}
interface TmpI2 // in original example, this is TmpI!TmpC
{
void func(TmpC);
}
class Tmp : TmpI1
{
void func(TmpI2) {}
}
There is no way TmpI2 casts implicitly to or from TmpC2, they are
unrelated types.
-Steve
More information about the Digitalmars-d-learn
mailing list