On Thursday, 1 August 2013 at 22:23:40 UTC, JS wrote:
This is wrong because

(cast(A)b.Y) = 3;

works.

That's an interesting case. cast(A)b.Y) is using the B getter property, which makes sense as, due to the cast, nothing in B can be called for the assigment.

So you have (in psuedo-code, all properties expanded as getY/setY):
    b.getY.castToA = 3;
wheras the previous example is:
    b.setY(3);

Neither are an int being implicitly converted to an A


b.Y = 3 should do the same as b.a = 3 which should be the same as b.a.x = 3.

Why that can't work:

struct A
{
    double x;
    alias x this;
}
struct B
{
    private A a;
    @property A Y() { importantGetPrep(); return a; }
    @property void Y(A v) { importantSetPrep(); a = v; }
}
void main()
{
    B b;
b.Y = 3; //cannot be a call to the setter as cannot convert 3 to A . //cannot be a call to the getter followed by an assigment
              //as the assignment would then have no effect on b.a
              //due to value semantics.
              //cannot be anything else as it would bypass the
//important*etPrep that must be called on all accesses
              //to B.a .
}

Putting functions like important*etPrep in properties are one of the main reasons why properties are useful, it would be a very bad idea to let them be circumvented by an implementation change in an internal struct.

Reply via email to