This is preliminary documentation and subject to change.
To comment on this topic, please send us email at ngwssdk@microsoft.com. Thanks!
3.6 Namespace and type names
Several contexts in a C# program require a namespace-name or a type-name to be specified. Either form of name is written as one or more identifiers separated by ".
" tokens.
- namespace-name:
- namespace-or-type-name
- type-name:
- namespace-or-type-name
- namespace-or-type-name:
- identifier
namespace-or-type-name . identifier
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 must refer to a type, or otherwise an error occurs.
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 must refer to a namespace, or otherwise an error occurs.
The meaning of a namespace-or-type-name is determined as follows:
- If the namespace-or-type-name consists of a single identifier:
- If the namespace-or-type-name appears within the body of a class or struct declaration, then starting with that class or struct declaration and continuing with each enclosing class or struct declaration (if any), if a member with the given name exists, is accessible, and denotes a type, then the namespace-or-type-name refers to that member. Note that non-type members (constructors, constants, fields, methods, properties, indexers, and operators) are ignored when determining the meaning of a namespace-or-type-name.
- Otherwise, starting with the namespace declaration in which the namespace-or-type-name occurs (if any), continuing with each enclosing namespace declaration (if any), and ending with the global namespace, the following steps are evaluated until an entity is located:
- If the namespace contains a namespace member with the given name, then the namespace-or-type-name refers to that member and, depending on the member, is classified as a namespace or a type.
- Otherwise, if the namespace declaration contains a using-alias-directive that associates the given name 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 with the given name, then the namespace-or-type-name refers to that type.
- Otherwise, if the namespaces imported by the using-namespace-directives of the namespace declaration contain more than one type with the given name, then the namespace-or-type-name is ambiguous and an error occurs.
- Otherwise, the namespace-or-type-name is undefined and an error occurs.
- Otherwise, the namespace-or-type-name is of the form
N.I
, where N
is a namespace-or-type-name consisting of all identifiers but the rightmost one, and I
is the rightmost identifier. N
is first resolved as a namespace-or-type-name. If the resolution of N
is not successful, an error occurs. Otherwise, N.I
is resolved as follows:
- If
N
is a namespace and I
is the name of an accessible member of that namespace, then N.I
refers to that member and, depending on the member, is classified as a namespace or a type.
- If
N
is a class or struct type and I
is the name of an accessible type in N
, then N.I
refers to that type.
- Otherwise,
N.I
is an invalid namespace-or-type-name, and an error occurs.