On Thursday, 1 August 2013 at 21:56:46 UTC, John Colvin wrote:
On Thursday, 1 August 2013 at 20:42:08 UTC, JS wrote:
http://dpaste.dzfl.pl/0c923861
class A
{
double x;
@property double X() { return x; }
@property double X(double v) { return x = v; }
alias X this;
}
class B
{
A a;
@property A Y() { return a; }
@property A Y(A v) { return a = v; }
}
void main()
{
B b = new B();
b.Y = 3;
}
error not a property of b.Y
adding refs to the returns of the getters allows the code to
work but only getters are called(hence the need for refs).
Please allow alias this to work with overloaded functions.
(specifically properties, b.Y = 3; is not b.Y() = 3 but
b.Y(3);)
b.Y = 3 is rewritten as b.Y(3)
You are asking for an "int" to be be implicitly convertible to
an "A", which isn't possible.
This is wrong because
(cast(A)b.Y) = 3;
works.
b.Y(3) should work because A is aliased to double.
One of the issues is
b.Y(3)
The setter of B is never called.
You are right that b.Y(3) does not accept an int(or double) BUT
this is a bug in the compiler because it should since 3 can be
assigned to it. It's just that the compiler isn't smart enough to
see this because of the way it calculates the assignment.
b.Y = 3 should do the same as b.a = 3 which should be the same as
b.a.x = 3.
If you think about what the code is actually doing you will see
it should be possible.
http://dpaste.dzfl.pl/ac376ca0