An object-creation-expression is used to create a new instance of a class-type or a value-type. object-creation-expression : newtype(argument-list)
The type of an object-creation-expression must be a class-type or a value-type. The type cannot be an abstract class-type.
The optional argument-list (14.4.1) is permitted only if the type is a class-type or a struct-type.
The compile-time processing of an object-creation-expression of the form new T(A), where T is a class-type or a value-type and A is an optional argument-list, consists of the following steps: If T is a value-type and A is not present: The object-creation-expression is a default constructor invocation. The result of the object-creation-expression is a value of type T, namely the default value for T as defined in 11.1.1.
Otherwise, if T is a class-type or a struct-type: If T is an abstract class-type, a compile-time error occurs. The instance constructor to invoke is determined using the overload resolution rules of 14.4.2. The set of candidate instance constructors consists of all accessible instance constructors declared in T. If the set of candidate instance constructors is empty, or if a single best instance constructor cannot be identified, a compile-time error occurs. The result of the object-creation-expression is a value of type T, namely the value produced by invoking the instance constructor determined in the step above.
Otherwise, the object-creation-expression is invalid, and a compile-time error occurs.
The run-time processing of an object-creation-expression of the form new T(A), where T is class-type or a struct-type and A is an optional argument-list, consists of the following steps: If T is a class-type: A new instance of class T is allocated. If there is not enough memory available to allocate the new instance, a System.OutOfMemoryException is thrown and no further steps are executed. All fields of the new instance are initialized to their default values (12.2). The instance constructor is invoked according to the rules of function member invocation (14.4.3). A reference to the newly allocated instance is automatically passed to the instance constructor and the instance can be accessed from within that constructor as this.
If T is a struct-type: An instance of type T is created by allocating a temporary local variable. Since an instance constructor of a struct-type is required to definitely assign a value to each field of the instance being created, no initialization of the temporary variable is necessary. The instance constructor is invoked according to the rules of function member invocation (14.4.3). A reference to the newly allocated instance is automatically passed to the instance constructor and the instance can be accessed from within that constructor as this.