What you see here is some kind of syntactic sugar provided by the compiler. Under the hood, what he really does is something like:
Person p = new Person (FirstName = "Joe", LastName = "Smith");
Person _p$1 = new Person();
_p$1.FirstName = "Joe";
_p$1.LastName = "Smith";
Person p = _p$1;
So, IMHO, you don’t actually break the basics of the constructor, but use a good language artifact to facilitate readability and ease of maintenance.