Object creation expressions
An object-creation-expression is used to create a new instance of a class-type or a value-type. object-creation-expression: object-or-collection-initializer: The type of an object-creation-expression must be a class-type, a value-type or a type-parameter. The type cannot be an abstract class-type. The optional argument-list (§7.5.1) is permitted only if the type is a class-type or a struct-type. An object creation expression can omit the constructor argument list and enclosing parentheses provided it includes an object initializer or collection initializer. Omitting the constructor argument list and enclosing parentheses is equivalent to specifying an empty argument list. Processing of an object creation expression that includes an object initializer or collection initializer consists of first processing the instance constructor and then processing the member or element initializations specified by the object initializer (§7.6.10.2) or collection initializer (§7.6.10.3). If any of the arguments in the optional argument-list has the compile-time type dynamic then the object-creation-expression is dynamically bound (§7.2.2) and the following rules are applied at run-time using the run-time type of those arguments of the argument-list that have the compile time type dynamic. However, the object creation undergoes a limited compile time check as described in §7.5.4.
The binding-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: o 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 §4.1.1. · Otherwise, if T is a type-parameter and A is not present: o If no value type constraint or constructor constraint (§10.1.5) has been specified for T, a binding-time error occurs. o The result of the object-creation-expression is a value of the run-time type that the type parameter has been bound to, namely the result of invoking the default constructor of that type. The run-time type may be a reference type or a value type. · Otherwise, if T is a class-type or a struct-type: o If T is an abstract class-type, a compile-time error occurs. o The instance constructor to invoke is determined using the overload resolution rules of §7.5.3. The set of candidate instance constructors consists of all accessible instance constructors declared in T which are applicable with respect to A (§7.5.3.1). If the set of candidate instance constructors is empty, or if a single best instance constructor cannot be identified, a binding-time error occurs. o 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 binding-time error occurs. Even if the object-creation-expression is dynamically bound, the compile-time type is still T. 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: o 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. o All fields of the new instance are initialized to their default values (§5.2). o 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 as this. · If T is a struct-type: o 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. o 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 as this.
|