According to the C# 4.0 Language Specification, section 1.6:
Instances of classes are created using the
newoperator, which allocates memory for a new instance, invokes a constructor to initialize the instance, and returns a reference to the instance.
It is the new operator who is responsible of allocating memory, passing a reference of the newly allocated object to the constructor and then returning a reference to the instance. This mechanism is also explained in section 7.6.10.1:
The run-time processing of an object-creation-expression of the form
new T(A), whereTis class-type or a struct-type andAis an optional
argument-list, consists of the following steps:
If
Tis a class-type:
A new instance of class
Tis allocated. If there is not enough
memory available to allocate the new instance, a
System.OutOfMemoryExceptionis thrown and no further steps are
executed.All fields of the new instance are initialized to their default
values (§5.2).The instance constructor is invoked according to the
rules of function member invocation (§7.5.4). A reference to the newly
allocated instance is automatically passed to the instance constructor
and the instance can be accessed from within that constructor asthis.[…]
This would mean that the constructor per se has no return type (void).