:this(foo, bar)
is syntactic sugar, there's nothing you can do with it that you can't do other ways. However, :base(foo, bar)
is not syntactic sugar, as it is the only way to call the constructor in question during construction of the derived class, especially considering that you must have a fully-constructed base class first, which fulfills any invariants defined in that class (e.g. if only some values of foo
are valid for some of bar
then it will throw an exception before you go further).
The way :base(foo, bar)
works enables classes to use encapsulation to ensure that they are never put into an invalid state, while still allowing for inheritance, this(foo, bar)
simply copies the same mechanism as a convenience for the programmer when there is common code used by more than one constructor.
Now, let's say we decided to have :this(foo, bar)
callable from anywhere. It would essentially be a method call. Well, we can already do that in a class constructor anyway. We've lost the syntactic similarity to :base(foo, bar)
(and consider that some people are already familiar with that C++, which lowered their learning-curve), and just added a a way to threat a constructor like a void-returning method, adding the complexity of checking it is in the body of a constructor (and having to deal with people asking why it can't be called elsewhere when it now looks like it should be possible, or else the weirdness of letting it be done), when people could just create such methods anyway.
In all, I think it was a good design decision.