struct Unshared(T) { private T value; T get() shared { return cast(T)value; } alias get this; void opAssign(T v) shared { value=cast(shared)v; } } shared synchronized class A { private Unshared!(int[]) a; int[] f() { return a; } }