ECMA-334: 10.8 Namespace and type names

Microsoft .NET Framework, ASP.NET, Visual C# (CSharp, C Sharp, C-Sharp) Developer Training, Visual Studio


Jump to: navigation, search
C# Language Specification
© 2006 ECMA International

10.8 Namespace and type names

Several contexts in a C# program require a namespace-name or a type-name to be specified.

namespace-name:
namespace-or-type-name
type-name:
namespace-or-type-name
namespace-or-type-name:
identifier type-argument-listopt
qualified-alias-member
namespace-or-type-name . identifier type-argument-listopt

A namespace-name is a namespace-or-type-name that refers to a namespace.

Following resolution as described below, the namespace-or-type-name of a namespace-name shall refer to a namespace, or otherwise a compile-time error occurs. Type arguments (§25.5.1) shall not be present in a namespace-name (only types can have type arguments).

A type-name is a namespace-or-type-name that refers to a type. Following resolution as described below, the namespace-or-type-name of a type-name shall refer to a type, or otherwise a compile-time error occurs.

The syntax and semantics of qualified-alias-member are defined in §16.7.

A namespace-or-type-name that is not a qualified-alias-member has one of four forms:

  • I
  • I<A1, ..., AK>
  • N.I
  • N.I<A1, ..., AK>

where I is a single identifier, N is a namespace-or-type-name and <A1, ..., AK> is an optional type-argument- list. When no type-argument-list is specified, consider K to be zero.

The meaning of a namespace-or-type-name is determined as follows:

  • If the namespace-or-type-name is a qualified-alias-member, the meaning is as specified in §16.7.
  • Otherwise, if the namespace-or-type-name is of the form I or of the form I<A1, ..., AK>:
  • If K is zero and the namespace-or-type-name appears within the body of a generic method declaration (§25.6) and if that declaration includes a type parameter (§25.1.1) with name I, then the namespace-or-type-name refers to that type parameter.
  • Otherwise, if the namespace-or-type-name appears within the body of a type declaration, then for each instance type T (§25.1.2), starting with the instance type of that type declaration and continuing with the instance type of each enclosing class or struct declaration (if any):
  • If K is zero and the declaration of T includes a type parameter with name I, then the namespaceor-type-name refers to that type parameter.
  • Otherwise, if T contains a nested accessible type having name I and K type parameters, then the namespace-or-type-name refers to that type constructed with the given type arguments. If there is more than one such type, the type declared within the more derived type is selected. [Note: Non-type members (constants, fields, methods, properties, indexers, operators, instance constructors, finalizers, and static constructors) and type members with a different number of type parameters are ignored when determining the meaning of the namespace-or-type-name. end note]
  • Otherwise, for each namespace N, starting with the namespace in which the namespace-or-typename occurs, continuing with each enclosing namespace (if any), and ending with the global namespace, the following steps are evaluated until an entity is located:
  • If K is zero and I is the name of a namespace in N, then:
  • If the location where the namespace-or-type-name occurs is enclosed by a namespace declaration for N and the namespace declaration contains an extern-alias-directive or using-alias-directive that associates the name I with a namespace or type, then the namespace-or-type-name is ambiguous and a compile-time error occurs.
  • Otherwise, the namespace-or-type-name refers to the namespace named I in N.
  • Otherwise, if N contains an accessible type having name I and K type parameters, then:
  • If K is zero and the location where the namespace-or-type-name occurs is enclosed by a namespace declaration for N and the namespace declaration contains an extern-alias-directive or using-alias-directive that associates the name I with a namespace or type, then the namespace-or-type-name is ambiguous and a compile-time error occurs.
  • Otherwise, the namespace-or-type-name refers to the type constructed with the given type arguments.
  • Otherwise, if the location where the namespace-or-type-name occurs is enclosed by a namespace declaration for N:
  • If K is zero and the namespace declaration contains an extern-alias-directive or using-aliasdirective that associates the name I with an imported namespace or type, then the namespace-or-type-name refers to that namespace or type.
  • Otherwise, if the namespaces imported by the using-namespace-directives of the namespace declaration contain exactly one type having name I and K type parameters, then the namespace-or-type-name refers to that type constructed with the given type arguments.
  • Otherwise, if the namespaces imported by the using-namespace-directives of the namespace declaration contain more than one type having name I and K type parameters, then the namespace-or-type-name is ambiguous and an error occurs.
  • Otherwise, the namespace-or-type-name is undefined and a compile-time error occurs.
  • Otherwise, the namespace-or-type-name is of the form N.I or of the form N.I<A1, ..., AK>. N is first resolved as a namespace-or-type-name. If the resolution of N is not successful, a compile-time error occurs. Otherwise, N.I or N.I<A1, ..., AK> is resolved as follows:
  • If K is zero and N refers to a namespace and N contains a nested namespace with name I, then the namespace-or-type-name refers to that nested namespace.
  • Otherwise, if N refers to a namespace and N contains an accessible type having name I and K type parameters, then the namespace-or-type-name refers to that type constructed with the given type arguments.
  • Otherwise, if N refers to a (possibly constructed) class or struct type and N contains a nested accessible type having name I and K type parameters, then the namespace-or-type-name refers to that type constructed with the given type arguments. If there is more than one such type, the type declared within the more derived type is selected.
  • Otherwise, N.I is an invalid namespace-or-type-name, and a compile-time error occurs.

A namespace-or-type-name is permitted to reference a static class (§17.1.1.3) if

  • The namespace-or-type-name is the T in a namespace-or-type-name of the form T.I, or
  • The namespace-or-type-name is the T in a typeof-expression (§14.5.11) of the form typeof(T)

Today's Deals: Electronics

Personal tools