On Wed, 12 Mar 2014 09:05:05 -0400, Steve Teale <[email protected]> wrote:

On Wednesday, 12 March 2014 at 11:13:00 UTC, monarch_dodra wrote:

That said, I'd expect this to work:

//----
interface I
{
   I myType();
}

class A: I
{
   //auto myType() { return cast(A) null; } //Nope
   A myType() { return cast(A) null; } //OK
}
//----

Yup, covariance desired, but

import std.stdio;

interface I
{
    I myType();
}

class A: I
{
    A myType() { return cast(A) null; }
    void foo() { writeln("foo"); }
}

void main()
{
    I a = new A();
    writeln(typeof(a.myType()).stringof);
}

returns I

Seems like a bug to me.

No, not a bug. What you want is actually not possible.

To demonstrate further:

void bad(I i)
{
   typeof(i.myType()) x;
}

class A : I
{
   A myType() { return cast(A)null;}
}

class B : I
{
   B myType() {return cast(B) null;}
}

void main()
{
   I[] arr = [new A, new B];
   foreach(i; arr) {bad(i);}
}

How is the compiler to build it's one copy of bad? Should x be typed as A or B? Or something not even seen in this module that could derive from I?

-Steve

Reply via email to