override bool opEquals(Object o) const { if (o is null) { return false; } writeln(o); // write: cast.Vector2D!(float).Vector2D Vector2D!(T) vec = cast(Vector2D!(T)) o; writeln(vec); // write: null // ... It seems the cast fail, but the question is: why?