This works fine: [code] import std.stdio;
class A { int val; alias val this; T opCast(T : Object)() { return to!(T)(this); } } class B : A { } T to(T : Object, U : Object)(const U obj) { return *(cast(T*) &obj); } void main () { A a = new B(); a.val = 42; writefln("a.val: %d", a.val); B* b = cast(B*) &a; writefln("*b.val: %d", b.val); B b1 = to!(B)(a); writefln("b1.val: %d", b1.val); B b2 = cast(B) a; writefln("b2.val: %d", b2.val); } [/code]